Я пытаюсь протестировать маршрутизатор в приложении Node.js с помощью Jest + Supertest, но мой маршрутизатор выполняет вызов службы, которая вызывает конечную точку:
router.post('/login', async (req, res, next) => {
try {
const { username, password } = req.body;
// I WANT TO MOCK userService.getUserInfo FUNCTION, BECAUSE IT IS MAKING A POST CALL
const identity = await userService.getUserInfo(username, password);
if (!identity.authenticated) {
return res.json({});
}
const requiredTenantId = process.env.TENANT_ID;
const tenant = identity.tenants.find(it => it.id === requiredTenantId);
if (requiredTenantId && !tenant) {
return res.json({});
}
const userResponse = {
...identity,
token: jwt.sign(identity, envVars.getVar(envVars.variables.AUTH_TOKEN_SECRET), {
expiresIn: '2h',
}),
};
return res.json(userResponse);
} catch (err) {
return next(err);
}
});
Это мой тест это хорошо работает:
test('Authorized - respond with user object', async () => {
const response = await request(app)
.post('/api/user/login')
.send(users.authorized);
expect(response.body).toHaveProperty('authenticated', true);
});
так выглядит функция getUserInfo
:
const getUserInfo = async (username, password) => {
const identity = await axios.post('/user', {username, password});
return identity;
}
, но она выполняет метод getUserInfo
внутри маршрутизатора, и этот метод создает REST call - я хочу смоделировать этот метод, чтобы избежать вызовов REST другим сервисам. Как это можно сделать?
Я нашел функцию mockImplementation в Jest docs https://jestjs.io/docs/en/mock-function-api.html#mockfnmockimplementationfn
, но как я могу высмеивать c в супер-тестировании ?