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
我能找到的最好的文档是代码本身,就在这里.
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)
Jos*_*ach 131
我发现了 =~它是不可预测的,它没有明显的原因失败.过去2.14,你应该使用
expect([1, 2, 3]).to match_array([2, 3, 1])
Run Code Online (Sandbox Code Playgroud)
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 匹配器提供了一种以忽略实际数组和预期数组之间排序差异的方式相互测试数组的方法。例如:
Run Code Online (Sandbox Code Playgroud)expect([1, 2, 3]).to contain_exactly(2, 3, 1) # pass expect([:a, :c, :b]).to contain_exactly(:a, :c ) # fail
正如其他人指出的那样,如果你想断言相反,数组应该匹配内容和顺序,然后使用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)