【问题标题】:RSpec: assert message calls on stub/spy argumentsRSpec:断言对存根/间谍参数的消息调用
【发布时间】:2013-08-23 04:24:09
【问题描述】:

是否有一种 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 添加其他我不关心的状态,这将中断

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      试试 Rspec 的#and_call_original

      【讨论】:

        猜你喜欢
        • 2015-11-22
        • 1970-01-01
        • 2015-04-21
        • 2012-03-29
        • 2021-04-05
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 1970-01-01
        相关资源
        最近更新 更多