【发布时间】: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
标签: node.js unit-testing jestjs mocking