Rspec:检查数组是否包含包含属性的对象

Jor*_*Ell 12 ruby arrays rspec ruby-on-rails

我有一个充满对象的json数组.

my_array = [{id => 6, name => "bob"}, 
           {id => 5, name => "jim"}, 
           {id => 2, name => "steve"}]
Run Code Online (Sandbox Code Playgroud)

我需要查看数组是否包含一个包含属性"id"的对象,该属性设置为5."name"属性未知.

我如何在rspec中执行此操作?

我知道如果我知道我可以做的名字属性:

my_array.should include({:id => 5, :name => "jim"}) 
Run Code Online (Sandbox Code Playgroud)

Sim*_*tti 24

expect(myArray.find { |item| item[:id] == 5 }).to_not be_nil
Run Code Online (Sandbox Code Playgroud)

或者使用遗留应该的语法

myArray.find { |item| item[:id] == 5 }.should_not be_nil
Run Code Online (Sandbox Code Playgroud)

请注意,这myArray不符合Ruby约定.变量使用下划线

my_array
Run Code Online (Sandbox Code Playgroud)

不是camelcase

myArray
Run Code Online (Sandbox Code Playgroud)

  • 教授正确的 Ruby 命名约定的加分项。太棒了! (2认同)

小智 20

也可以使用 having_attributes 别名:

expect(my_array).to include( an_object_having_attributes(id: 5) )
Run Code Online (Sandbox Code Playgroud)

或者,在我自己的用例中,匹配整个数组:

expect(my_array).to contain_exactly(
  an_object_having_attributes(id: 5),
  an_object_having_attributes(id: 6),
  an_object_having_attributes(id: 2)
)
Run Code Online (Sandbox Code Playgroud)

  • 哈希数组的类似解决方案(当我找到这篇文章时我正在寻找的):“expect(my_array).to include(a_hash_include(id: 5))” (2认同)

ilg*_*gam 6

您可以展开一个数组并检查两个数组的匹配,如下所示:

expect(my_array).to include(*compare_array) 
Run Code Online (Sandbox Code Playgroud)

它将展开并匹配数组的每个值。

它相当于这样:

expected([1, 3, 7]).to include(1,3,7)
Run Code Online (Sandbox Code Playgroud)

来源:Relish 文档