typescript - 类型错误:来自 jest.spyOn() 的 mockReturnValueOnce 推断参数类型为 void
问题描述
我正在尝试模拟 bcrypt 的比较方法的返回值。compare 方法的返回类型是 Promise<boolean>。当我写这行“jest.spyOn(bcrypt, 'compare').mockReturnValueOnce()”时,推断为 mockReturnValueOnce 的参数类型是 void 而不是 Promise<boolean>。所以,我不能用这个“new Promise(resolve => resolve(false))”来模拟返回值,因为我收到了一个 TypeScript 错误:“TS2345:'Promise<unknown>' 类型的参数不可分配给输入‘无效’”。
谢谢你。
import bcrypt from 'bcrypt'
import { BcryptAdapter } from './bcrypt-adapter'
jest.mock('bcrypt', () => ({
async hash (): Promise<string> {
return await new Promise(resolve => resolve('hash'))
},
async compare (): Promise<boolean> {
return await new Promise(resolve => resolve(true))
}
}))
const salt = 12
const makeSut = (): BcryptAdapter => {
return new BcryptAdapter(salt)
}
describe('Bcrypt Adapter', () => {
test('Should return false when compare fails', async () => {
const sut = makeSut()
jest.spyOn(bcrypt, 'compare').mockReturnValueOnce(new Promise(resolve => resolve(false)))
const isValid = await sut.compare('any_value', 'any_hash')
expect(isValid).toBe(false)
})
})
依赖项:
"devDependencies": {
"@shelf/jest-mongodb": "^2.0.1",
"@types/bcrypt": "^5.0.0",
"@types/express": "^4.17.13",
"@types/jest": "^26.0.24",
"@types/mongodb": "^3.6.20",
"@types/node": "^15.14.0",
"@types/supertest": "^2.0.11",
"@types/validator": "^13.6.3",
"@typescript-eslint/eslint-plugin": "^4.28.4",
"eslint": "^7.31.0",
"eslint-config-standard-with-typescript": "^20.0.0",
"eslint-plugin-import": "^2.23.4",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.3.1",
"git-commit-msg-linter": "^3.2.6",
"husky": "^7.0.1",
"jest": "^27.0.6",
"lint-staged": "^11.1.0",
"sucrase": "^3.20.0",
"supertest": "^6.1.4",
"ts-jest": "^27.0.4",
"typescript": "^4.3.5"
},
"dependencies": {
"bcrypt": "^5.0.1",
"express": "^4.17.1",
"fast-glob": "^3.2.7",
"mongodb": "^3.6.10",
"validator": "^13.6.0"
}
解决方案
老哥试试这个:
jest.spyOn(bcrypt, 'compare').mockImplementation(() => Promise.resolve(false))
它对我有用。
推荐阅读
- python - 为什么替换只在某些场合有效?
- mysql - 具有两个引用的主键
- javascript - 正则表达式检测带有 2+ 数字和 2+ 字符的单词
- python - 基于 CSV 的登录系统问题
- protractor - E/launcher - 进程退出,错误代码为 100
- php - 我的 ajax 调用得到了正确的响应,但没有做任何事情
- python - 在 Python 中对“命令式外壳,功能核心”进行单元测试时遇到问题
- makefile - 生成文件到 CodeLite
- cakephp - Cake : 未能打开 stream() 权限
- python - 在 python 中执行代码时如何更改 URL 中的脚本名称