9

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

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

我正在尝试存根@bar(假设它是 class 的一个实例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?)

编辑:

@bar被分配在一个before_filter. 就像是@bar = Bar.find(n)

4

3 回答 3

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)
于 2014-11-04T23:52:02.460 回答
1
 Bar.any_instance.stub(:can_do_something?)
于 2013-01-16T15:50:02.073 回答
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
于 2013-01-16T23:46:41.383 回答