0

我在 RSpec 中使用 RR 进行模拟和存根,并且我遇到了一种情况,我想从设置一些实例变量的控制器的超类中存根方法。我可以弄清楚如何存根方法调用,如果我调试我可以看到我的存根块被调用,但我无法让块中的实例变量传播到我正在测试的类中。

只是为了打破它:

class A < ApplicationController
  before_filter :bogglesnap

  def bogglesnap
    @instancevar = "totally boggled"
  end
end

class B < A
  def do_something_with_instance
    if @instancevar 
      ....
    else
      ....
    end
  end
end

这是基本设置,所以在我对控制器 B 的测试中,我想从 A 中删除 bogglesnap 方法以将 @instancevar 设置为我想要的东西。我只是不知道该怎么做。

我已经尝试了 RR 的 instance_of 存根,只是将控制器定义存根:

stub.instance_of(A).bogglensap { @instancevar = "known value" }
stub(controller).bogglesnap { @instancevar = "known value" }

但这些似乎都不起作用,好吧,它们不起作用:)

是否有人对您应该如何存根该方法调用并设置实例变量有任何指示?我假设它与运行块的上下文有关,但我希望有人以前遇到过这样的事情。

谢谢

4

1 回答 1

2

您可以instance_variable_set通过调用对象实例来使用方法并将其设置为您想要的任何内容,就像这样

 controller.instance_variable_set("@instancevar", "known value")

同样,如果您想在规范或调试中获取实例变量的值或从类外部执行其他操作,那么您可以通过执行

 controller.instance_variable_get("@instancevar")

请注意,instance_variable_set方法instance_variable_get不仅适用于控制器,还适用于 ruby​​ 提供的所有对象。事实上,这两种方法在 Rails 魔术中起着重要作用:)

于 2010-02-23T05:49:52.690 回答