我在RRSpec中使用RR进行模拟和 stub ,并且遇到了一种情况,我想从设置某些实例变量的 Controller 的父类(super class)中 stub 方法。我可以弄清楚如何对方法调用进行 stub ,如果调试,可以看到已 stub 的块已被调用,但是我无法使该块中的实例变量传播到我正在测试的类中。

只是为了分解:

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

这是基本设置,因此在 Controller B的测试中,我想将A的bogglesnap方法 stub ,以将@instancevar设置为所需的值。我只是不知道该怎么做。

我已经尝试了RR的instance_of stub ,只是 stub 了 Controller 定义:
stub.instance_of(A).bogglensap { @instancevar = "known value" }
stub(controller).bogglesnap { @instancevar = "known value" }

但是这些似乎都不起作用,嗯,它们不起作用:)

有没有人对如何应该 stub 该方法调用并设置实例变量有任何指示?我假设它与运行块的上下文有关,但是希望有人之前遇到过这种情况。

谢谢

最佳答案

您可以通过调用对象实例并将其设置为所需的任何方式来使用instance_variable_set方法,如下所示

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

同样,如果您想在规范中获取实例变量的值或进行调试或从类外部进行其他操作,则可以通过执行以下操作获取值
 controller.instance_variable_get("@instancevar")

请注意,instance_variable_setinstance_variable_get方法不仅适用于 Controller ,而且适用于ruby提供的所有对象。实际上,这两种方法在rails magic中起着重要作用:)

关于ruby-on-rails - 如何在Rails的父类(super class)中存入before_filter?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2316238/

10-13 02:09