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

  • 相关阅读:
    Android Studio连接真机
    day 4 __all__ 包 __init__.py
    day1 创建X00001文件1K
    day 3 模块
    day 2 异常传递 ,抛出
    day 1 异常基本功能
    day 7 __new___
    day 6 汽车4S店铺
    day 5 多态 类 静态
    day 4 继承
  • 原文地址:https://www.cnblogs.com/qxxblogs/p/13675114.html
Copyright © 2020-2023  润新知