使用 rspec-expectations 3.13.3 并具有如下代码:
def methname(**kwargs)
# let's assume this method doesn't mind whether the kwargs are keyed by symbols or strings
p(received: kwargs)
end
使用如下测试
expect(something).to receive(:methname).with(hash_including(what_ever: "else"))
但在某些情况下,关键字参数被创建为字符串,而不是符号,因此失败了,我必须这样做
expect(something).to receive(:methname).with(hash_including("what_ever" => "else"))
我可以在每个规范中做到这一点,但如果我可以无差别地匹配它,对我来说会更干净 -
# desired code
expect(something).to receive(:methname).with(hash_including_indifferently(what_ever: "else"))
有没有办法可以做到这一点?
没有内置匹配器支持此功能,但我们可以使用内置匹配器来实现此目标(一次性使用)或创建我们自己的匹配器(多次使用)。
解决方案
如果您经常需要此功能,或者需要更灵活地选择是否包含
Hash
,那么最好的办法是定义自己的匹配器。请参阅:自定义匹配器。例如这将有效:
用法:
方法论
kwargs
如果您想要以允许包含{"what_ever" => "else"}
或的方式进行测试,{what_ever: "else"}
您可以按如下方式进行测试:因为
receive
使用块会产生块的参数,并且您可以使用复合期望明确地测试它们。但是,如果
Hash
同时包含:what_ever
和"what_ever"
作为键,只要其中一个具有值,"else"
则此测试将通过。鉴于您的意图是让此测试对键是String
或无所谓Symbol
,因此键也需要唯一无所谓,因此您可能希望测试如下:这将防止任何
Hash
可能同时包含"what_ever"
和:what_ever
键的歧义,同时确保其中一个存在且值为"else"
。