【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的单元测试真的很坑-_-

posted @ 2020-09-15 20:32  _chacha  阅读(345)  评论(0编辑  收藏  举报