如何在Rails中的超类中存根一个before_filter?

时间:2010-02-23 05:07:04

标签: ruby-on-rails rspec integration-testing stubbing

我在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" }

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

有没有人有关于如何能够存根该方法并将其设置为实例变量的指针?我假设它与运行块的上下文有关,但我希望有人之前遇到类似这样的事情。

由于

1 个答案:

答案 0 :(得分:2)

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

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

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

 controller.instance_variable_get("@instancevar")

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