我有一个testcafe测试,该测试检查API响应JSON是否有匹配的字符串,并且无论响应JSON中的内容是什么,该测试始终会通过。
我正在运行Gherkin / Testcafe集成。最后一个“然后”步骤是检查API响应JSON正文。
logger = RequestLogger(config.serverUrl + '/api/v1/service', {
logResponseHeaders: true,
logResponseBody: true,
});
await t
.addRequestHooks(logger)
.navigateTo(config.serverUrl + '/admin/integrations')
.expect(logger.contains(record => record.response.statusCode === 200))
.ok();
await t
.expect(
logger.contains(async record => {
// console.log(record.response.headers);
const body =
record.response.headers['content-encoding'] === 'gzip'
? await getBody(record.response.body)
: record.response.body.toString();
const bodyJson = JSON.parse(body);
return bodyJson.filter(node => node.title === "Devtest").length == 1;
})
)
.ok();
最后,代码应根据是否找到至少一个包含“ Devtest”的项目来返回true / false。
但是,无论数字是多少,测试始终会通过。
答案 0 :(得分:2)
RequestLogger
不支持predicate
函数的contains
参数的异步函数。
因此,这种期望始终会通过-await t.expect(logger.contains(async record => false)).ok()
。
要解决此问题,我建议您将代码分成两个参数:
const record = request.records.find(r => ...);
const body = record.response.headers['content-encoding'] === 'gzip'
? await getBody(record.response.body)
: record.response.body.toString();
const bodyJson = JSON.parse(body);
await t.expect(bodyJson.filter(node => node.title === "Devtest").length === 1).ok();
我还看到自动解压缩响应正文的功能可以简化您的测试代码。如果有时间,您可以尝试实现此功能,并在TestCafe repository中打开拉取请求。