ruby - 如何使用 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 产量匹配器,但无法完成任务。(也许我一直在寻找错误的关键字..)
解决方案
最简单的方法是插入一个 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
,但我总是更喜欢使用特定的双精度。
推荐阅读
- google-contacts-api - Google Connection API 未获取其所有联系人,少数联系人丢失
- java - `BufferReader` 在按下 ENTER 之前不显示控制台输入(键入)(仅适用于 Windows 和 Mac,适用于 Linux)
- python - 将值从 1 个列表传递到矩阵中的子列表
- react-native - 如何将 ref 写入组件?
- html - Shopee XPath 将关注者数量抓取到 Google 表格中
- pine-script - 顺序计数和标签触发 Pine 脚本
- xml - 在 Mule 中验证 XML 完整性
- javascript - 从 MS Excel WebApp 外部调用 Office 脚本
- javascript - setTimeout 如何处理 JavaScript/TypeScript 中的窗口来源和上下文?(使用 window.close() 函数关闭选项卡)
- python - 未找到 cx_Oracle 模块