1

是否有一种 RSpec 方法可以对传递给其他对象的参数的返回值进行断言?

说我期待Checker#notify打电话Mailer.send(report),我想断言report.errors_count会返回2

我非常接近这个:

expect(Mailer).to have_received(:send).with(hash_including(:errors_count => 2))

但这仅适用于哈希。如果我通过 aPORO或 a怎么办Structduck_type()也非常接近,但只是断言定义了方法,而不是它的返回值(这是这里的重要部分)。

PS:理想情况下,我想避免做这样的事情:

expected_report = Report.new.tap{|r| r.errors_count = 2}
expect(Mailer).to have_received(:send).with(expected_report)
  1. 我宁愿测试接口,而不是依赖于用于生成报告的实际类(嘎嘎嘎嘎)
  2. 如果Checker添加我不关心的其他状态,这将打破
4

2 回答 2

2

知道了!您可以将块传递给receive. 它接受传递给方法的参数,因此您可以对它们进行任何测试:

expect(Mailer).to receive(:send_mail) do |report|
  expect(report.error_count).to be(2)
end

编辑:这似乎不适用于 spy ( have_received) 版本。测试将为绿色,但不会评估该块。

于 2013-08-23T06:04:32.627 回答
1

试试 Rspec 的#and_call_original

于 2013-08-23T05:47:37.537 回答