我有一个控制器测试,我正在努力解决。基本上控制器看起来像这样:
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块的内部,而不是之前的过滤器。在我的情况下,为了实际执行前置过滤器,我必须模拟一些TON模型对象。我有另一个测试。我想确保前过滤器的'副作用'完成...在这种情况下,@ foo被初始化为它的模拟版本。
基本上我想做:
controller.foo = mock_foo_object
但这不起作用。我也尝试过:
controller.stub!(:foo).and_return(mock_foo_object)
虽然我期望(哈哈)这个工作,但事实并非如此。我得到的唯一真实反馈是@foo对象永远不会被设置,因此我们得到了if,而不是else条件。
任何帮助将不胜感激......
答案 0 :(得分:0)
所以我找到了这个解决方案:我可以将一个块传递给具有副作用的方法的存根,而不是模拟访问器,以实现副作用:
controller.stub!(:set_up_foo) { controller.set_instance_variable(:@foo, @mock_foo_object) }
这样可以确保我关心的一个副作用实际发生。我试过这个,它就像一个魅力。