我正在尝试编写一个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
中查找它。
答案 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
。
如果您进行以下任何一项测试,则效果会更好:
response['products'][0]
,或者product
,然后使用product_id
匹配器。