可以从Ruby中的FlexMock对象中删除模拟方法吗?

时间:2011-01-17 13:36:37

标签: ruby mocking

给定一个模拟对象,我想在对象的生命周期中多次重新模拟一个方法,如下所示:

mock = flexmock
[ :foo, :bar ].each do |val|
  mock.should_receive(:my_method).and_return val
  assert_equal val, mock.my_method, "my_method"
end

但是,运行此测试的失败:bar

my_method.
<:bar> expected but was
<:foo>.

基本上,FlexMock不会更新现有的期望。任何想法(除了“使用Mocha /另一个模拟框架”)?

2 个答案:

答案 0 :(得分:0)

在Rspec中我会使用上下文来做这个并模拟它我是如何期望它在一系列测试中。 (然后在下一个系列的下一个上下文中会有所不同)

你可能不得不放弃一些紧凑性以获得正确性。

答案 1 :(得分:0)

它直接涉及对FlexMock对象的攻击,但毕竟这就是Ruby Way! ;)

  def clear_mocked_method(mock, method)
    mock.instance_eval { @expectations.delete method.to_sym }
  end