0

我有一个我正在尝试完成的控制器测试。基本上控制器看起来像这样:

before_filter :set_up_foo

def set_up_foo
  ...
  @foo = SomeObject.create(params[:some_object_attributes])
  ...
end

def some_action
  # reference @foo
  if @foo.nil?
    ...
  else
    # this is what I want to test
    ...
  end
end

我不想测试 else 块的内部结构,而不是 before 过滤器。在我的情况下,我必须模拟大量模型对象才能实际执行 before 过滤器。我对此有另一个测试。我想确保完成之前过滤器的“副作用”......在这种情况下,@foo 被初始化为它的模拟版本。

基本上我想做:

controller.foo = mock_foo_object

但这不起作用。我也试过:

controller.stub!(:foo).and_return(mock_foo_object) 

尽管我希望(哈哈)这行得通,但事实并非如此。我得到的唯一真实反馈是 @foo 对象从未设置,因此我们得到了 if,而不是 else 条件。

任何帮助将不胜感激...

4

1 回答 1

0

所以我找到了这个解决方案:我可以将一个块传递给具有副作用的方法的存根,而不是模拟访问器,以实现该副作用:

controller.stub!(:set_up_foo) { controller.set_instance_variable(:@foo, @mock_foo_object) }

这具有确保我关心的一个副作用确实发生的效果。我试过这个,它就像一个魅力。

于 2012-05-08T18:36:34.293 回答