javascript - 如何处理 Jest 测试用例中的 Promise 拒绝?
问题描述
我正在开发一个节点 JS 项目,我正在为其编写测试用例。代码 -
jest.mock('../../utils/db2.js')
const request = require('supertest')
const executeDb2Query = require('../../utils/db2.js')
const app = require('../../app')
describe('check connect test', () => {
beforeEach(() => {
jest.resetModules()
})
it('check Bad Pool', async () => {
executeDb2Query.mockImplementation(() =>
Promise.reject(new Error('Unable to connect to db2'))
)
const response = await request(app).get(
'/api/v1/abc/xyz/123456'
)
expect(response).rejects.toMatch('Unable to connect to db2')
//expect(response.body.msg).toEqual('Unable to connect to db2')
expect(response.status).toEqual(500)
})
executeDb2query 是一种执行查询的方法。注释行工作正常,但是当我添加 rejects.toMatch 时,测试用例失败如下 -
check connect test › check Bad Pool
expect(received).rejects.toMatch()
Matcher error: received value must be a promise or a function returning a promise
Received has type: object
Received has value: {"header": {"connection": "close", "content-length": "2", "content-security-policy-report-only"
)
> 24 | expect(response).rejects.toMatch('Unable to connect to db2')
| ^
25 |
26 | //expect(response.body.msg).toEqual('Unable to connect to db2')
27 | expect(response.status).toEqual(500)
at Object.toMatch (node_modules/expect/build/index.js:226:11)
对于解决案例 -
it('check Good Pool', () => {
executeDb2Query.mockImplementation(() =>
Promise.resolve([
{
isAvailable: true
}
])
)
const response = request(app).get('/api/v1/abc/xyz/090703')
expect(response).resolves.toStrictEqual([
{
isAvailable: true
}
])
})
错误 -
expect(received).resolves.toStrictEqual()
Matcher error: received value must be a promise
Received has value: undefined
35 | )
36 | const response = request(app).get('/api/v1/abc/xyz/090703')
> 37 | expect(response.body).resolves.toStrictEqual([
| ^
38 | {
39 | isAvailable: true
40 | }
at Object.toStrictEqual (node_modules/expect/build/index.js:185:11)
在进一步检查中,测试用例通过但给出错误 -
(node:23978) UnhandledPromiseRejectionWarning: Error: expect(received).rejects.toThrow()
Received promise resolved instead of rejected
Resolved to value: {"header": {"connection": "close", "content-length": "1499", "content-security-policy-report-only"
(node:23978) UnhandledPromiseRejectionWarning: Error: expect(received).resolves.toStrictEqual(expected) // deep equality
Expected: [{"isAvailable": true}]
Received: {"header": {"connection": "close", "content-length": "1499", "content-security-policy-report-only": "default-src 'self'"
我尝试在线搜索并尝试了各种方法,但始终出现相同的错误。
有什么建议么?
解决方案
expect(response).rejects
假设response
是一个 Promise。但是,您已经在使用await
,所以response
不是 Promise - 它是该 Promise 的分辨率值。
删除await
, 或(如果您收到的是响应而不是承诺拒绝)保留await
但停止匹配 .rejects。
如果您决定继续使用expect(...).rejects
,您可能需要等待断言:
await expect(...).rejects.toMatch(...);
推荐阅读
- reactjs - 使用分页搜索和过滤
- java - 运行gradlew测试时如何限制某些包的日志?
- google-cloud-platform - Pulumi GCP Manage Oauth2.0 Client Id Redirect URI
- .net-core - 使用 dotnet 核心的 OneSignal 推送通知返回 NULL ID
- geopandas - 将点分配给最近的多边形
- javascript - 如何在仅在滚动时显示的 CSS 中保持粘性
- visual-studio-code - 在 VSCode 中创建向导的最佳实践是什么
- android - Android compose 更新 Room 数据库中的数据时,不会发生重组
- php - CURL Post 请求产生错误 '{"error":"invalid_request"}' (length=27)
- android - 华为 ML Kit 文字转语音错误