假设我有一个MyKlass#do_thing方法,我想在测试中准确地调用一次(因为它可能会更改状态),并且成功更改状态后应该返回true,否则返回false。我想写一个看起来像这样的规范:

it "Updates myvalue if condition is met" do
  wojit = MyKlass.new

  # ... assuming condition is met
  expect { wojit.do_thing }.to change { wojit.value }.and.be true
end

但是此特定方法会收到ArgumentError,因为#and需要1个参数。

我可以通过以下令人讨厌的方式使其工作:
expect { expect(wojit.do_thing).to be true }.to change { wojit.value }

但这是荒谬的。我是否还缺少一些惯用语?

最佳答案

另一种方法是将返回值粘贴在变量中。

return_value = nil
expect{ return_value = wojit.do_thing }.to change{ wojit.value }
expect( return_value ).to be true

YMMV关于它比嵌套expect更好还是更坏。

关于ruby - 您可以同时在RSpec中测试状态更改和返回值吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49256551/

10-13 04:42