如何在 Jest 中测试失败时打印请求和响应?
How to print the request and response when a test fails in Jest?
我正在使用 Supertest 和 Jest 来测试 Node.js API。
示例测试具有以下格式
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
expect(res.status).toBe(200);
done();
})
});
当前,当期望失败时,将记录以下内容
expect(received).toBe(expected) // Object.is equality
Expected: 200
Received: 404
我还想记录请求和响应以及失败的测试,以便在调试时获得更多上下文。
有没有办法也打印那些,只针对失败的测试?
您可以像这样打印响应:
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
if(!expect(res.status).toBe(200)) console.log('res',res) // print response
expect(res.status).toBe(200);
done();
})
});
expect
通过在期望失败时抛出 Error
来工作。
Error
的 message
属性 是打印在测试报告中的内容。
我想如果你想使用一个 现有的 期望并且只是想用额外的数据来增加失败消息,你可以捕获 Error
,附加你的额外数据到 message
属性,然后像这样再次抛出 Error
:
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
try {
expect(res.status).toBe(200);
} catch (err) {
// --- add additional data to the error message here ---
err.message = `${err.message}\n\nfailing query: ${graphQLQuery}`;
throw err; // throw the error so test fails as expected
}
done();
})
});
您可以创建一个 custom matcher 来记录预期失败时的响应:
expect.extend({
statusCode(expected, response) {
const { status } = response
const pass = expected === status
if (pass) {
return {
message: () =>
`expected ${status} to be ${expected}`,
pass: true
}
} else {
return {
message: () =>
`expected ${status} to be ${expected}. Response: ${response}`,
pass: false
}
}
}
})
然后在您的测试中,使用自定义匹配器而不是典型的 expect
:
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
expect.statusCode(200, res)
done()
})
})
不幸的是,。但是您可以在自定义匹配器的签名中添加关于请求的任意信息。
如果您为正文添加额外的预期,如果它与预期的不匹配,它将被记录下来。在状态码 expect 之前有这个 expect 会产生你想要的效果。
我正在使用 Supertest 和 Jest 来测试 Node.js API。
示例测试具有以下格式
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
expect(res.status).toBe(200);
done();
})
});
当前,当期望失败时,将记录以下内容
expect(received).toBe(expected) // Object.is equality
Expected: 200
Received: 404
我还想记录请求和响应以及失败的测试,以便在调试时获得更多上下文。
有没有办法也打印那些,只针对失败的测试?
您可以像这样打印响应:
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
if(!expect(res.status).toBe(200)) console.log('res',res) // print response
expect(res.status).toBe(200);
done();
})
});
expect
通过在期望失败时抛出 Error
来工作。
Error
的 message
属性 是打印在测试报告中的内容。
我想如果你想使用一个 现有的 期望并且只是想用额外的数据来增加失败消息,你可以捕获 Error
,附加你的额外数据到 message
属性,然后像这样再次抛出 Error
:
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
try {
expect(res.status).toBe(200);
} catch (err) {
// --- add additional data to the error message here ---
err.message = `${err.message}\n\nfailing query: ${graphQLQuery}`;
throw err; // throw the error so test fails as expected
}
done();
})
});
您可以创建一个 custom matcher 来记录预期失败时的响应:
expect.extend({
statusCode(expected, response) {
const { status } = response
const pass = expected === status
if (pass) {
return {
message: () =>
`expected ${status} to be ${expected}`,
pass: true
}
} else {
return {
message: () =>
`expected ${status} to be ${expected}. Response: ${response}`,
pass: false
}
}
}
})
然后在您的测试中,使用自定义匹配器而不是典型的 expect
:
it('Read a note for a user', (done) => {
request(graphqlURL)
.post('/graphql')
.set(baseHeaders())
.send({
query: graphQLQuery
})
.end((err, res) => {
expect.statusCode(200, res)
done()
})
})
不幸的是,。但是您可以在自定义匹配器的签名中添加关于请求的任意信息。
如果您为正文添加额外的预期,如果它与预期的不匹配,它将被记录下来。在状态码 expect 之前有这个 expect 会产生你想要的效果。