存在控制器内的实例变量

时间:2013-01-16 15:39:37

标签: ruby-on-rails ruby rspec tdd

我正在使用rspec 1.3.2来测试看起来像这样的控制器动作:

def action_foo
  ...
  @bar.can_do_something?
  ...
end

我正在尝试存根@bar(假设它是类Bar的实例)实例变量,但我无法。我想如果我可以访问any_instance那么我就可以Bar.any_instance.stub(:can_do_something?)但是我在使用的rspec版本中没有这个版本。

是否有其他方式可以访问和存根@bar?以下都不起作用:

@bar.stub(:can_do_something?)
controller.instance_variable_get("@bar").stub(:can_do_something?)
controller.stub_chain(:bar, :can_do_something?)
Bar.new.stub(:can_do_something?)

编辑:

@barbefore_filter中分配。像@bar = Bar.find(n)

这样的东西

3 个答案:

答案 0 :(得分:3)

为了记录,我认为这有点清洁:

bar = Bar.new # or use FactoryGirl to create a Bar factory
bar.stub(:can_do_something?) { # return something }
controller.instance_variable_set(:@bar, bar)

答案 1 :(得分:1)

 Bar.any_instance.stub(:can_do_something?)

答案 2 :(得分:1)

如果所有其他方法都失败了,您可以执行类似于any_instance.stub的操作。为了记录,这让我觉得很脏。

Bar.class_eval do
  alias :original_can_do_something? :can_do_something?

  def can_do_something?  # "stub" method
    # Return whatever you need here
  end
end

# Run your test

Bar.class_eval do
  alias :can_do_something? :original_can_do_something?  # "unstub" the method
end