RoR и RSpec: как получить доступ к переменным экземпляра контроллера без определения методов доступа?

Я пишу тесты rspec для своего контроллера и не могу найти решение следующей проблемы. Для одного из крайних тестов мне нужно проверить значение одной переменной экземпляра. Как я могу получить к нему доступ, не определяя аксессор? По умолчанию обычный:

controller.variable.should == '3.15' 

не работает.

Определение

attr_reader: переменная

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


person Jakub Troszok    schedule 16.07.2009    source источник


Ответы (1)


controller.instance_variable_get(:var)

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

РЕДАКТИРОВАТЬ: Разве assigns(:var) магия тестирования рельсов не делает то же самое с контроллерами?

person Ben Hughes    schedule 16.07.2009
comment
Да, вероятно, вы правы - я должен проверить результаты действия, а не детали реализации. Спасибо, в любом случае. - person Jakub Troszok; 16.07.2009
comment
справедливости ради, для контроллеров переменные экземпляра — это то, что нужно тестировать. Я ответил на этот вопрос перед кофе. - person Ben Hughes; 16.07.2009
comment
Вопрос на самом деле не имел отношения к тому, что я делал, просто нужно было проверить наличие переменной экземпляра контроллера. @BenHughes, ваш ответ (и последующий ответ) очень помог. Спасибо. - person Tass; 16.01.2012
comment
Используйте assigns (это бесплатный метод, а не controller.assigns), так как instance_variable_get может иметь больше ограничений, чем assigns. Например: 'event' is not allowed as an instance variable name, но assigns без проблем обнаруживает @event. - person MattiSG; 26.11.2012
comment
@BenHughes, спасибо, это что-то тривиальное, но я бы указал controller.instance_variable_get(:@var) и присваивает (: var) - person ecoologic; 11.03.2013
comment
Идиотские рельсы 5 не поддерживают метод assigns - person asiniy; 21.08.2015