Rspec:ID存在于ID的列表中

时间:2018-11-07 22:05:21

标签: ruby rspec

我正在尝试编写一个ID列表中存在一个ID的测试用例

我尝试了以下操作,但没有用。

expect(response['products'][0]['ids'][0]['product_id'])
              .to include(product_1.id, product_2.id, product_3.id)

每次都会失败,并显示错误的预期ID不存在。 例如,预期“ 123”包括“ 343”和“ 543”

但是当我单步执行代码时,所有id都在那里,所以不明白为什么只在两个ids中查找它。

1 个答案:

答案 0 :(得分:3)

response['products'][0]['ids'][0]['product_id'] String "123"

String#include?将在此处返回true,用于以下输入:"""1""2""3",{{1} },"12""23"-但这显然不是您要测试的内容!

您想检查此"123"是否在列表中 ;并非它包含列表。


由于您的期望有些模糊,因此运行此测试有点不寻常。

如果这是一个product_id应用程序(即您正在使用rails),则可以使用Object#in?编写测试,如下所示:

ActiveSupport

或者,如果我们仅使用香草红宝石,则可以使用expect(response['products'][0]['ids'][0]['product_id']) .to be_in(product_1.id, product_2.id, product_3.id) 的{​​{3}}:

rspec

您也可能会想简单地颠倒参数的顺序-从技术上讲是可行的,但由于代码似乎在错误的对象上运行断言而有些混乱:

expect(response['products'][0]['ids'][0]['product_id'])
  .to satisfy { |product_id| [product_1.id, product_2.id, product_3.id].include?(product_id) }

但是回到这是“不寻常的测试”。

大概是用这种方式写的,因为您不确定expect([product_1.id, product_2.id, product_3.id]) .to include(response['products'][0]['ids'][0]['product_id']) 的列出顺序-即哪种产品实际上是id

如果您进行以下任何一项测试,则效果会更好:

  • 知道了顺序(但是我真的不能在没有看到更多细节的情况下建议这样做),这样一来您就不需要模糊匹配器,或者
  • 在此测试中,响应仅返回1个response['products'][0],或者
  • 将测试更改为从响应中读取所有三个 product,然后使用product_id匹配器。