如何使用Rspec使用块测试ruby模块方法?

时间:2018-10-12 08:24:25

标签: ruby testing rspec

我想测试以下方法,该方法使用一个块调用模块方法。

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 yield matchers,但无法完成任务。 (也许我是在搜索错误的关键字。)

2 个答案:

答案 0 :(得分:0)

最简单的方法是插入双精度字符作为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,但是我总是更喜欢使用特定的double。

答案 1 :(得分:0)

我会模拟MyModule来产生另一个模拟,这将允许推测my_text=是在产生的对象上被调用的。

let(:payload) { instance_double('Payload') }

before do
  allow(MyModule).to receive(:send).and_yield(payload)
  allow(payload).to receive(:my_text=).and_return(nil)
end

# expectations 
expect(MyModule).to have_received(:send).once
expect(payload).to have_received(:my_text=).with('payload text').once