Должен ли я открыть переменные экземпляра класса только для проверки теста? - PullRequest
2 голосов
/ 21 апреля 2011

Я новичок в BDD, и я нахожу множество случаев, когда я добавляю переменные экземпляра только в attr_accessor, чтобы мои тесты имели простой способ проверить, находятся ли они в состоянии, в котором они должны быть.Но это кажется немного грязным, потому что никакой другой класс не нуждается в этой информации, и поэтому я только обнародую ее для тестов.Это стандарт или признак плохого дизайна?

Например, у меня есть класс коллекции, который хранит объект, а затем фиксирует его в пакетном массиве.В конце импорта пакетный массив используется для пакетной вставки в базу данных.Но нет необходимости проверять состояние партии в любой момент.Но при тестировании я хочу убедиться, что партия находится в том состоянии, в котором я думаю, и поэтому я открываю эту переменную для проверки.Является ли факт, что это не проверяется в коде, реальной проблемой?

Ответы [ 2 ]

2 голосов
/ 11 мая 2011

НЕ ДЕЛАЙТЕ ЭТОГО!

Это слишком глубоко. Смотрите комментарии @Andy и @Michael в теме другого «принятого» ответа

Не пишите модульные тесты, которые смотрят внутрь кода. Если это не то, что вы можете видеть из внешних интерфейсов к объекту, тогда нет необходимости в модульном тестировании. Вы проходите мимо того, как код ведет себя, как он реализует это поведение, и вам не нужны тесты, которые опускаются до этого уровня, поскольку они не предоставляют никакой реальной ценности с точки зрения доказательства того, что код делает то, что должен.

Просто подумайте, сколько тестов вам, возможно, придется обновить, если кто-то перефакторинг этого кода и, чтобы сделать его более читабельным, изменяет внутренние имена вещей ... или, возможно, найдет лучший способ сделать что-либо и все переменные экземпляра измениться .. Модуль кода все еще может работать отлично, но модульные тесты не пройдут ..

В качестве альтернативы, если было внесено изменение, которое регулирует, как внутренние переменные сообщают интерфейсу, код может быть эффективно нарушен, но тесты, которые проверяют внутренние значения переменных экземпляра, не сообщат ни о какой ошибке.

2 голосов
/ 21 апреля 2011

Используете ли вы instance_variable_get вариант?

>> class Foo
..   def initialize
..     @foo = 'bar'
..     end
..   end #=> nil
>> Foo.new.instance_variable_get(:@foo) #=> "bar"
...