我在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 stubbing,只是简单地删除了控制器定义:
stub.instance_of(A).bogglensap { @instancevar = "known value" }
stub(controller).bogglesnap { @instancevar = "known value" }
但这些似乎都不起作用,好吧,它们不起作用:)。
有没有人有关于如何能够存根该方法并将其设置为实例变量的指针?我假设它与运行块的上下文有关,但我希望有人之前遇到类似这样的事情。
由于
答案 0 :(得分:2)
您可以通过调用对象实例并使用instance_variable_set
方法将其设置为您想要的任何内容,例如
controller.instance_variable_set("@instancevar", "known value")
同样地,如果您想要在规范或调试中获取实例变量的值,或者从类外部执行其他操作,那么您可以通过执行来获取值
controller.instance_variable_get("@instancevar")
请注意,instance_variable_set
和instance_variable_get
方法不仅可用于控制器,还可用于ruby提供的所有对象。事实上,这两种方法在铁路魔术中起着重要作用:)