为何JetBrains Rider HTTP Client中响应测试未失败?代码缺陷在哪?
JetBrains HTTP Client测试未按预期失败的原因分析
Web服务返回的JSON数据
{ "title": "Test how to filter the response", "features": [ { "feature": "AB1", "price": "1.00"}, { "feature": "AB1", "price": "1.23"}, { "feature": "CD2", "price": "2.00"}, { "feature": "EF3", "price": "3.00"}, { "feature": "GH4", "price": "4.00"} ] }
预期测试目标
- 测试
AB1仅出现1次(预期值=1,实际值=2) - 测试
AB1的价格为0.00(预期值)而非其他值(实际值为1.00和1.23)
原测试代码
> {% // 本应失败,因为返回了2个AB1特征 client.test("feature AB1 was sent 1 time", function() { var features = response.body.features; const result = features.filter(obj => obj.feature === "AB1"); result.forEach(r => client.log(JSON.stringify(r))); client.assert(result.length, "1"); }); // 本应失败,因为价格不是0.00 client.test("feature AB1 price is 0.00", function() { var features = response.body.features; const result = features.filter(obj => obj.feature === "AB1"); client.assert(result[0].price, "0.00"); client.log("price of " + result[0].feature + " = " + result[0].price); }); %}
上述代码在Rider中运行后未触发预期的测试失败。
问题解答
为何测试未失败?
核心原因是**client.assert()方法的参数使用错误**。该方法要求第一个参数必须是布尔类型的判断条件,而非直接传入实际值和预期值。当传入非布尔值时,方法会自动将其转换为布尔值进行判断:
- 第一个测试中,
result.length的值是2,转换为布尔值为true;第二个参数"1"转换为布尔值也为true,断言判定为通过。 - 第二个测试中,
result[0].price的值是"1.00",转换为布尔值为true;"0.00"转换为布尔值也为true,断言同样判定为通过。
代码中的缺陷/错误在哪里?
两处测试的client.assert()调用均不符合方法的正确语法,同时第二个测试存在逻辑漏洞:
- 第一个测试的错误:未构造正确的判断条件,应直接比较
result.length是否等于1。
修正后的代码:client.assert(result.length === 1, "feature AB1 should be sent exactly 1 time"); - 第二个测试的错误:同样未构造正确的判断条件,且未考虑
AB1不存在的情况(会导致result[0]报错)。
修正后的代码:// 先确保AB1存在 client.assert(result.length > 0, "feature AB1 should exist in response"); // 再验证价格是否符合预期 client.assert(result[0].price === "0.00", "price of AB1 should be 0.00");
内容的提问来源于stack exchange,提问作者surfmuggle
相关产品推荐
相关产品推荐

