如何在RSpec中匹配内容相同但对象不同的含哈希数组的哈希参数?
解决RSpec中哈希数组内容匹配的问题
你遇到的问题是虽然两个数组内容完全一致,但它们是不同的对象引用——不过其实Ruby里数组的==本来就是比较内容的,可能是你当前的写法没有触发RSpec去检查内容,而是直接做了对象身份的校验?没关系,我们可以用RSpec的数组匹配器来明确指定要匹配内容而非对象本身。
你只需要把hash_including里的filters[:hash_obj]替换成对应的数组匹配器就行,分两种情况:
1. 严格匹配顺序和内容
如果你需要数组里的哈希顺序完全一致,就用eq匹配器:
expect(myObj).to receive(:new).with( anything, anything, anything, anything, hash_including( hash_obj: eq(filters[:hash_obj]) ) )
2. 只匹配内容,忽略顺序
如果数组里的哈希顺序不影响结果,用match_array会更灵活:
expect(myObj).to receive(:new).with( anything, anything, anything, anything, hash_including( hash_obj: match_array(filters[:hash_obj]) ) )
原理说明
eq会递归检查数组及其内部哈希的内容是否完全一致,不管是不是同一个对象,只要内容对得上就会通过。match_array(也可以用contain_exactly作为别名)会检查数组包含的所有元素是否都存在,不关心它们的排列顺序。
这样就能完美解决你因为对象不同导致的匹配失败问题啦。
内容的提问来源于stack exchange,提问作者kaur
相关产品推荐
相关产品推荐

