【sinon】使用sinon stub方法报错:Promise returned by test never resolved
背景: NodeJS做后端,要写单元测试,使用使用sinon来stub 异步执行的repository。前面都还好好的,突然有一个测试红了,报错Promise returned by test never resolved,是异步方法没有mock成功,但是看发现调用的方法确实是mock了,百思不得其解,最后一个同事发现了问题
代码结构大概这样
1 // user.repository
2
3 const findUserById = async (id) => {
4 await userModel.find({id: id})
5 }
6
7 module.exports = {
8 findUserById
9 }
10
11
12 // user.service
13 const { findUserById } = require('../repository/user.repository')
14
15 const findUserById = async (id) => {
16 return await findUserById(id)
17 }
18
19 module.exports = {
20 findUserById
21 }
22
23 // user.service.test
24 const test = require('ava')
25 const sinon = require('sinon')
26 const userRepository = require('../repository/user.repository')
27 const userService = require('../service/user.service')
28
29 let sandbox = sinon.createSandbox()
30 sandbox.stub(userRepository)
31 test.afterEach(() => {
32 sandbox.restore()
33 })
34
35 test('demo', t => {
36 const exceptUser = {id: 1, name: 'demo'}
37 userRepository.findUserById.withArgs(1).returns(exceptUser)
38 const foundUser = userService.findUserById(1)
39 t.is(exceptUser, foundUser)
40 })
这样写咋一看没有问题,但运行的时候就会报错Promise returned by test never resolved,google各种组合都找不到答案,最后求助同事,给出解决方案
原来是sinon在stub的时候是stub的userRepository(如上代码第30行),在mock参数与返回值的时候是这样的userRepository.findUserById.withArgs(1).returns(exceptUser)(第37行),相当于只mock了userRepository.findUserById这种调用方式,但我在user.service里导入方法的时候是只require了userRepository的findUserById方法(第13行),因此在调用时也是findUserById这样调用的(第16行),这个方法并没有被mock到,所以就报错了
正确方案
user.service修改为
const userRepository = require('../repository/user.repository')
const findUserById = async (id) => {
await userRepository.findUserById({id: id})
}
module.exports = {
findUserById
}
问题解决
*****
NodeJS的单元测试真的很坑-_-