Тестирование before_filter вызывается в действии - PullRequest
5 голосов
/ 07 июля 2010

Как можно проверить, что при обращении к действию в контроллере будет выполняться этот before_filter этого контроллера?

before_filter тестируется в отдельной группе примеров, поэтому нет необходимости дублировать тесты для всех действийэто зависит от before_filter.

Если у меня в моем примере

controller.should_receive(:my_before_filter)

, он работает нормально.Однако наличие вышеуказанного ожидания, по-видимому, приводит к тому, что логика в my_before_filter не выполняется (ей следует назначить переменную экземпляра).

Как преодолеть это ограничение или высмеивать поведение my_before_filter (оно устанавливает экземплярпеременная на контроллере)?Или есть какой-нибудь лучший способ сделать это?


Поскольку теперь ясно, что я все делал неправильно, я все еще хотел бы знать, как можно посмеяться над поведением before_filter, которое устанавливает переменную экземпляра,Конечно, это должно быть возможно сделать в спецификации контроллера?

Ответы [ 3 ]

7 голосов
/ 08 июля 2010

Тестирование фильтра слишком пристально смотрит на реализацию, ИМО. Вы хотите убедиться, что присваивание переменной экземпляра происходит, а не происходит ли оно внутри фильтра или в действии - проверьте результат, а не реализацию.

3 голосов
/ 07 июля 2010

В RSpec следует_после того, что вы ожидаете получить метод, но как фиктивный метод, поэтому он на самом деле не вызывает реальный метод, в данном случае это my_before_filter.

http://axonflux.com/rspecs-shouldreceive-doesnt-ac

Если my_before_filter уже тестировался в отдельном тесте, как вы говорите, вам не следует беспокоиться о том, что вызывается настоящий тест.

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

Кстати, если вам нужно вернуть значение, вы можете увидеть «Возвращаемые значения» на следующей странице.

http://rspec.info/documentation/mocks/message_expectations.html

1 голос
/ 13 февраля 2014

В ответ на ваш вопрос

«Я все еще хотел бы знать, как можно издеваться над поведением before_filter, который устанавливает переменную экземпляра. "

вот мой ответ:

controller.should_receive(:my_before_filter) 
controller.instance_variable_set(:@my_instance_var, "some value")
...