我想测试以下方法,该方法使用一个块调用模块方法。
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,但无法完成任务。 (也许我是在搜索错误的关键字。)
答案 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