Как можно было бы протестировать это, когда к действию в контроллере получают доступ, что before_filter контроллера будет выполняться?
before_filter тестируется в отдельной группе в качестве примера так, чтобы не было никакой потребности копировать тесты для всех действий, которые зависят от before_filter.
Если я имею
controller.should_receive(:my_before_filter)
в моем примере это хорошо работает. Однако наличие вышеупомянутого ожидания, кажется, вызывает это логика в my_before_filter
не выполняется (это должно присвоить переменную экземпляра).
Как преодолеть это ограничение или дразнить поведение my_before_filter (это устанавливает переменную экземпляра на контроллере)? Или есть ли некоторый лучший способ сделать это?
Поскольку теперь ясно, что я делал все это неправильно, я все еще хотел бы знать, как можно было дразнить поведение before_filter, который устанавливает переменную экземпляра. Конечно, это должно быть возможное, чтобы сделать это в спецификации контроллера?
При тестировании фильтра слишком внимательно рассматривается реализация, ИМО. Вы хотите убедиться, что присвоение переменной экземпляра происходит, а не происходит ли оно в фильтре или в действии - тестируйте результат, а не реализацию.
should_receive в RSpec подразумевает, что вы ожидаете получить метод, но как имитатор метода, поэтому он не вызывает настоящий метод, которым в данном случае является "my_before_filter".
http://axonflux.com/rspecs-shouldreceive-doesnt-ac
Если my_before_filter уже протестирован в отдельном тесте, как вы говорите, то вас не должно волновать, что вызывается настоящий метод.
Таким образом, вы должны протестировать реальную функциональность в одном тесте и проверить, что она вызывается в другом, как вы уже делаете.
Кстати, если вам нужно, чтобы он возвращал значение, вы можете посмотреть "Возвращаемые значения" на следующей странице.
http://rspec.info/documentation/mocks/message_expectations.html