繁体   English   中英

开玩笑 - 在另一个模块 function 内模拟 function

[英]Jest - mock function inside another module function

我试图用 Jest 模拟另一个模块的 function 中函数的返回值(或实现)。 我需要测试不同的场景(函数抛出错误,返回 null,返回 object 等......)

该模块 (userService) 返回一个 function ,该模块返回一个 object 具有以下功能:

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;

目前我已经能够模拟 function 返回值只有 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'}),
  • ETC...

谢谢!

我修复了它导入文件顶部 controller function 之外的所有服务。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM