【问题标题】:RSpec: how to set a controller's instance variableRSpec:如何设置控制器的实例变量
【发布时间】:2015-06-01 17:44:04
【问题描述】:

我的 rails 控制器中有这个方法:

def some_init_func
  # ...
  @inst_var = 1
  # ...
end

及以后:

do_something_with(@inst_var)

如何在 RSpec 中设置这个实例变量?

allow(controller).to receive(:some_init_func) do
  # ???? what goes here ????
end

【问题讨论】:

  • 该变量从何而来?
  • 你试过assign(:inst_var, 1)吗?
  • @AbM 我确实尝试过。获取NoMethodError: undefined method 'assign'

标签: ruby-on-rails ruby rspec controller rspec-rails


【解决方案1】:

assign 是一种可用于视图测试的 RSpec 方法,但不支持控制器测试。控制器通常需要设置实例变量,因此 RSpec 不允许设置它们,但它允许检查它们(即通过assigns)。

不过,为了回答您的问题,Ruby 为所有对象提供了一个 instance_variable_set 方法,您可以从控制器测试中调用该方法,如下所示:

controller.instance_variable_set(:@inst_var, 1)

有关文档,请参阅 http://ruby-doc.org/core-2.2.2/Object.html#method-i-instance_variable_set,并注意半开玩笑的解释。

【讨论】:

    【解决方案2】:

    如果set_inst_variable 是公共方法,则只需调用controller.set_inst_variable

    (通常最好通过类的公共接口进行测试,而不是更改其内部状态)。

    【讨论】:

    • 这个函数并不是真正的“set_inst_variable”函数。它是一个通用的 init 函数,可以做很多其他的事情。对不起,我编辑了这个问题:)
    • 我的观点仍然是操纵对象的内部状态以进行测试通常是一种不好的方法。这意味着您的测试不会反映对象在生产代码中的实际使用方式,因此测试变得不那么有效。如果您可以发布更多控制器的代码,那么也许可以就如何测试它提供更具体的建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多