我经常想比较数组,并确保它们包含相同的元素,在任何顺序。在RSpec中有一个简洁的方法来做到这一点吗?
以下是不可接受的方法:
#to_set
举例来说:
expect(array.to_set).to eq another_array.to_set
字符串
或
array.to_set.should == another_array.to_set
型
当数组包含重复项时,此操作将失败。
#sort
举例来说:
expect(array.sort).to eq another_array.sort
型
或
array.sort.should == another_array.sort
型
当数组元素不实现#<=>
时,此操作失败
6条答案
按热度按时间a9wyjsp71#
试试
array.should =~ another_array
我能找到的最好的文档是代码本身,也就是here。
4zcjmb1e2#
从RSpec 2.11开始,你也可以使用
match_array
。字符串
在某些情况下更容易理解。
型
j2datikz3#
我发现
=~
是不可预测的,它已经失败了,没有明显的原因。字符串
vmpqdwk34#
使用
match_array
,它接受另一个数组作为参数,或contain_exactly
,它接受每个元素作为单独的参数,有时对可读性很有用。示例如下:
字符串
或
型
x33g5p2x5#
对于RSpec 3,使用
contain_exactly
:contain_exactly匹配器提供了一种测试数组的方法,这种方法忽略了实际数组和预期数组之间的顺序差异。
字符串
正如其他人所指出的,如果你想Assert相反的情况,数组应该同时匹配内容和顺序,那么使用
eq
,即:型
f0brbegy6#
没有很好的记录,但我还是添加了链接:
Rspec3 docs
第一个月
Rspec2 docs
expect([1, 2, 3]).to match_array([2, 3, 1])
个