ruby Rspec:“array.should == another_array”但不考虑顺序

4xrmg8kj  于 2024-01-07  发布在  Ruby
关注(0)|答案(6)|浏览(106)

我经常想比较数组,并确保它们包含相同的元素,在任何顺序。在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


当数组元素不实现#<=>时,此操作失败

a9wyjsp7

a9wyjsp71#

试试array.should =~ another_array
我能找到的最好的文档是代码本身,也就是here

4zcjmb1e

4zcjmb1e2#

从RSpec 2.11开始,你也可以使用match_array

array.should match_array(another_array)

字符串
在某些情况下更容易理解。

[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])

j2datikz

j2datikz3#

我发现=~是不可预测的,它已经失败了,没有明显的原因。

expect([1, 2, 3]).to match_array([2, 3, 1])

字符串

vmpqdwk3

vmpqdwk34#

使用match_array,它接受另一个数组作为参数,或contain_exactly,它接受每个元素作为单独的参数,有时对可读性很有用。
示例如下:

expect([1, 2, 3]).to match_array [3, 2, 1]

字符串

expect([1, 2, 3]).to contain_exactly 3, 2, 1

x33g5p2x

x33g5p2x5#

对于RSpec 3,使用contain_exactly
contain_exactly匹配器提供了一种测试数组的方法,这种方法忽略了实际数组和预期数组之间的顺序差异。

expect([1, 2, 3]).to    contain_exactly(2, 3, 1) # pass
expect([:a, :c, :b]).to contain_exactly(:a, :c) # fail

字符串
正如其他人所指出的,如果你想Assert相反的情况,数组应该同时匹配内容和顺序,那么使用eq,即:

expect([1, 2, 3]).to     eq([1, 2, 3])
expect([1, 2, 3]).not_to eq([2, 3, 1])

f0brbegy

f0brbegy6#

没有很好的记录,但我还是添加了链接:

Rspec3 docs

第一个月

Rspec2 docs

expect([1, 2, 3]).to match_array([2, 3, 1])

相关问题