RoR和RSpec:如何在不定义访问器的情况下访问控制器实例变量?

Jak*_*zok 20 controller rspec ruby-on-rails

我正在为我的控制器编写一个rspec测试,但我找不到解决问题的方法.对于其中一个边缘案例测试,我需要验证一个实例变量的值.如何在不必定义访问者的情况下访问它?通常默认情况下:

controller.variable.should == '3.15' 
Run Code Online (Sandbox Code Playgroud)

不起作用.

定义

attr_reader:变量

只是让测试通过将是愚蠢的,我敢肯定有一个更智能的方式.

Ben*_*hes 44

controller.instance_variable_get(:var)
Run Code Online (Sandbox Code Playgroud)

如果您发现自己这样做,您可能需要重新考虑信息隐藏的方法,以便您测试基本行为而不是偶然的实现细节.您的测试应该确保"事物"能够正常运行而不必过于严格地绑定到特定的实现.

编辑:不是assigns(:var)轨道测试与控制器做同样的事情魔术?

  • 公平地说,对于控制器,实例变量是应该测试的东西.咖啡前我回答了这个问题. (6认同)
  • 使用`assigns`(它是一个自由的方法,而不是`controller.assigns`),因为`instance_variable_get`可能比`assigngs`有更多的限制.例如:''event'不允许作为实例变量名称`,但`assigns`检测到`@ event`没有任何问题. (4认同)