【问题标题】:How can I stub a before_filter in a super class in Rails?如何在 Rails 的超类中存根 before_filter?
【发布时间】:2011-01-19 22:47:02
【问题描述】:

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

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

有没有人知道你应该如何存根该方法调用并让它设置实例变量?我假设它与运行块的上下文有关,但我希望有人以前遇到过这样的事情。

谢谢

【问题讨论】:

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


    【解决方案1】:

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

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

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

     controller.instance_variable_get("@instancevar")
    

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

    【讨论】:

    • 我知道 ruby​​ 提供的实例变量和动态编程的东西,我只是没想过使用它...感谢大脑的刺激! :) 我刚刚尝试过并确认它有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-11
    • 1970-01-01
    相关资源
    最近更新 更多