Invasion Of Privacy

Definition:

  • A test is written directly against a method that’s intended to be a private implementation detail of the subject.

Code Example:

# Subject under test
class SeatMap
  def initialize(ticket, original_seat)
    @fare_class = ticket.fare_class
    @current_seat = original_seat
  end

  def moveTo(new_seat)
    raise "No seat selected" unless new_seat
    raise "Invalid seat selected" unless /^\d\d?[A-J]$/.test(new_seat)

    if qualify_fare_class_for_seat(new_seat)
      @current_seat = new_seat
    else
      raise Error "Seat not available for ticket's fare class"
    end
  end

  private

  # Private API! Don't call this!
  def qualify_fare_class_for_seat(seat)
    return unless seat

    if row_match = seat.match(/^(\d+)/)
      row = row_match[0].to_i
      row > 10
    end
  end
end

# Test
class InvasionOfPrivacy < SmellTest
  def setup
    @ticket = OpenStruct.new(fare_class: "M")
    @subject = SeatMap.new(@ticket, "18D")
    super
  end

  def test_ensure_seat_not_null
    result = @subject.send(:qualify_fare_class_for_seat, nil)

    refute result
  end

  def test_do_not_break_if_seat_lacks_a_row_number
    result = @subject.send(:qualify_fare_class_for_seat, "A")

    refute result
  end

  def test_approve_if_behind_row_ten
    result = @subject.send(:qualify_fare_class_for_seat, "11B")

    assert_equal true, result
  end

  def test_deny_if_ahead_of_row_ten
    result = @subject.send(:qualify_fare_class_for_seat, "9J")

    refute result
  end
end

References:

Quality attributes

  • - Code Example

  • - Cause and Effect

  • - Frequency

  • - Refactoring