Rspec:将控制器属性设置为我的模拟对象

时间:2012-05-08 14:39:47

标签: ruby-on-rails ruby-on-rails-3 rspec

我有一个控制器测试,我正在努力解决。基本上控制器看起来像这样:

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条件。

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

1 个答案:

答案 0 :(得分:0)

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

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

这样可以确保我关心的一个副作用实际发生。我试过这个,它就像一个魅力。