Rspec:"array.should == another_array"但不关心订单

nic*_*des 229 ruby testing rspec

我经常想要比较数组并确保它们以任何顺序包含相同的元素.在RSpec中有一个简洁的方法吗?

以下是不可接受的方法:

#to_set

例如:

expect(array.to_set).to eq another_array.to_set
Run Code Online (Sandbox Code Playgroud)

要么

array.to_set.should == another_array.to_set
Run Code Online (Sandbox Code Playgroud)

当数组包含重复项时,这会失败.

#sort

例如:

expect(array.sort).to eq another_array.sort
Run Code Online (Sandbox Code Playgroud)

要么

array.sort.should == another_array.sort
Run Code Online (Sandbox Code Playgroud)

当数组元素未实现时,这会失败 #<=>

x1a*_*1a4 262

尝试 array.should =~ another_array

我能找到的最好的文档是代码本身,就在这里.

  • **Rspec 3.0**语法是`expect([1,2,3]).到match_array([2,1,3])`参见:http://stackoverflow.com/a/19436763/33226 (42认同)
  • 这篇文章的标题:"Rspec:"array.should == another_array"但不关心订单" (14认同)
  • 如果您使用的是rspec 3.0中的新"expect"语法,请参阅@JoshKovach的答案. (7认同)
  • 在不匹配的情况下的错误消息也非常好. (2认同)
  • 现在,[运营商匹配器]正式记录了这一点(https://www.relishapp.com/rspec/rspec-expectations/v/2-14/docs/built-in-matchers/operator-matchers) (2认同)

Val*_*cev 232

既然RSpec 2.11你也可以使用match_array.

array.should match_array(another_array)
Run Code Online (Sandbox Code Playgroud)

在某些情况下,这可能更具可读性.

[1, 2, 3].should =~ [2, 3, 1]
# vs
[1, 2, 3].should match_array([2, 3, 1])
Run Code Online (Sandbox Code Playgroud)

  • 是的,刚刚升级到rails 4并且=〜停止工作,match_array正常工作,谢谢! (8认同)
  • 如果那更具可读性,我不知道.现在它看起来应该是完全匹配,但事实并非如此.之前的波形很模糊,对阵列没什么意义,所以我没有先入为主.也许只是我. (2认同)

Jos*_*ach 131

我发现了 =~它是不可预测的,它没有明显的原因失败.过去2.14,你应该使用

expect([1, 2, 3]).to match_array([2, 3, 1])
Run Code Online (Sandbox Code Playgroud)

  • 也有效过去3.0:`期望([1,2,3]).到contains_exactly(2,3,1)`.https://www.relishapp.com/rspec/rspec-expectations/v/3-0/docs/built-in-matchers/contain-exactly-matcher (17认同)

Tim*_*ins 11

对于 RSpec 3 使用contain_exactly

有关详细信息,请参阅https://relishapp.com/rspec/rspec-expectations/v/3-2/docs/built-in-matchers/contain-exactly-matcher,但这里有一个摘录:

contains_exactly 匹配器提供了一种以忽略实际数组和预期数组之间排序差异的方式相互测试数组的方法。例如:

    expect([1, 2, 3]).to    contain_exactly(2, 3, 1) # pass
    expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail
Run Code Online (Sandbox Code Playgroud)

正如其他人指出的那样,如果你想断言相反,数组应该匹配内容和顺序,然后使用eq,即:

    expect([1, 2, 3]).to    eq([1, 2, 3]) # pass
    expect([1, 2, 3]).to    eq([2, 3, 1]) # fail
Run Code Online (Sandbox Code Playgroud)


nic*_*des 10

使用match_array,将另一个数组作为参数,或者contain_exactly将每个元素作为单独的参数,并且有时对可读性有用.(docs)

例子:

expect([1, 2, 3]).to match_array [3, 2, 1]
Run Code Online (Sandbox Code Playgroud)

要么

expect([1, 2, 3]).to contain_exactly 3, 2, 1
Run Code Online (Sandbox Code Playgroud)