Jest - 在另一个模块函数中模拟函数

Posted

技术标签:

【中文标题】Jest - 在另一个模块函数中模拟函数【英文标题】:Jest - mock function inside another module function 【发布时间】:2021-04-19 19:33:42 【问题描述】:

我正在尝试使用 Jest 模拟另一个模块函数中的函数的返回值(或实现)。我需要测试不同的场景(函数抛出错误、返回 null、返回对象等)

该模块 (userService) 返回一个函数,该函数返回具有该函数的对象:

userService.js(我想模拟 findUser & createUser 的返回值)

...
function userService(userModel) 
  async function findUser(userQuery) 
    ...
    return foundUser;
  

  async function createUser(user) 
    ...
    return createdUser;
  

  return  findUser, createUser ;


module.exports = userService;

我正在测试使用该服务功能的 authStravaController: authStravaController

...
const authStravaServiceRaw = require('../../services/authStravaService');
const userServiceRaw = require('../../services/userService');
const bikeServiceRaw = require('../../services/bikeService');
...

function authStravaController(userModel, bikeModel) 
  const  findUser, createUser  = userServiceRaw(userModel); <-- WANT TO MOCK THAT FUNCTIONS

  async function authStrava( body:  authCode  , res) 
    ...
    try 
      ...
      const findUserQuery = 
        stravaUserId: stravaBasicUser.stravaUserId,
      ;
      authUser = await findUser(findUserQuery); <-- MOCK THIS FUNCTION RETURN MULTIPLE TIMES

      if (!authUser) 
        resStatus = CREATED;
        createdUser = await createUser(stravaBasicUser); <-- SAME
        ...
        createdUser.bikes = createdBikes.map((bike) => bike._id);
        createdUser.save();

        authUser =  createdUser, createdBikes ;
      

      return handleResponseSuccess(res, resStatus, authUser);
     catch (authStravaError) 
      return handleResponseError(res, authStravaError);
    
  
  return  authStrava ;


module.exports = authStravaController;

目前我只能模拟1次函数返回值,我找不到重写的方法,所以现在只能测试1个场景

文件顶部的这段代码让我测试 1 个场景

jest.mock('../../services/userService', () => () => (
  findUser: jest.fn().mockReturnValue(1),
  createUser: jest.fn().mockReturnValue( username: 'userName', save: jest.fn() ),
));

我尝试以多种方式模拟它,但无法让它工作,我该如何测试不同的返回值:

findUser: jest.fn().mockReturnValue(1), findUser: jest.fn().mockReturnValue(undefined), findUser: jest.fn().mockReturnValue(user:'username'), 等等……

谢谢!

【问题讨论】:

如果你只做 jest.mock('../../.service/userService) 然后再做 expect(findUser.mock).toBeTruthy() 会通过吗? 不,它会抛出这个错误:ReferenceError: findUser is not defined 【参考方案1】:

我修复了它在文件顶部导入控制器功能之外的所有服务。

这样我可以模拟任何函数的 returnValue。

【讨论】:

以上是关于Jest - 在另一个模块函数中模拟函数的主要内容,如果未能解决你的问题,请参考以下文章

jest.fn() 值必须是模拟函数或 spy 接收函数:[Function getTemplates]

用 Jest 模拟基于承诺的请求

如何在 Jest 中模拟一个函数

Jest - 模拟函数,从另一个文件导入

如何使用 jest.fn() 在 jest 中使用 typescript 模拟函数

模拟 es6 模块返回工厂函数(moment.js)