RSpec:对存根/间谍参数断言消息

时间:2013-08-23 04:24:09

标签: ruby-on-rails ruby unit-testing rspec mocking

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

说我希望Checker#notify致电Mailer.send(report),我想断言report.errors_count会返回2吗?

我非常接近这个:

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

但这只适用于散列。如果我传递的是POROStruct,该怎么办? duck_type()也非常接近,但只是声明方法是定义的,而不是它的返回值(这是一个重要的部分)。

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

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

2 个答案:

答案 0 :(得分:1)

尝试Rspec的#and_call_original

答案 1 :(得分:0)

知道了!您可以将块传递给receive。它接受传递给方法的参数,因此您可以测试它们上的任何内容:

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

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