首页 > 解决方案 > 如何使用 Rspec 测试带有块的 ruby​​ 模块方法?

问题描述

我想测试一个下面的方法,它用一个块调用一个模块方法。

def test_target
  MyModule.send do |payload|
    payload.my_text = "payload text"
  end
end

MyModule的结构如下。

module MyModule
  class Payload
    attr_accessor :my_text

    def send
      # do things with my_text
    end
  end

  class << self
    def send
      payload = Payload.new
      yield payload
      payload.send
    end
  end

如何测试MyModule接收send方法是否带有分配"payload text"给的块payload.my_text

目前我只是在测试expect(MyModule).to receive(:send).once。我查看并尝试了Rspec 产量匹配器,但无法完成任务。(也许我一直在寻找错误的关键字..)

标签: rubytestingrspec

解决方案


最简单的方法是插入一个 double 作为yield参数,您可以对其进行断言。

payload = Payload.new
allow(Payload).to receive(:new).and_return(payload)

test_target

expect(payload.my_text).to eq 'payload text'

或者,您也可以使用expect_any_instance_of,但我总是更喜欢使用特定的双精度。


推荐阅读