Я пытался юнит-тестирование в nodejs.
Вот мой код:
import { Request, Response, Router } from 'express';
import { asyncErrorHandler } from '../apiError';
import { ResponseCodes } from '../utils/responseCodes';
import { benchProfileService } from '../services/benchProfile.service';
import { logger } from '../utils/logger';
export function addRoutes(router: Router, imports: any): void {
router.get('/api/profile/:stationId', asyncErrorHandler(async (req: Request, res: Response) => {
const stationId = Number(req.params.stationId);
console.log(stationId);
const benchProfile = await benchProfileService.findOne({ where: { 'stationId': stationId } }); // this is the point of interest
console.log(benchProfile); // To check what is returned
if (benchProfile) {
logger.debug('Bench Profile found in database');
return res.status(ResponseCodes.Ok).json(benchProfile.dataValues.profile);
}
...
(Обмен только соответствующим кодом)
Как вы можете видеть, я использую сервис с именем 'benchProfileService', который объявлен вдругой класс.
Теперь, когда я тестирую этот код, я хочу смоделировать функцию 'benchProfileService.findOne ()', чтобы получить ложный ответ.
Я пытаюсь использовать spyOn ().and.returnValue (), который, в соответствии с моим пониманием, должен следить за вызовом функции и возвращать фиктивные данные
Вот мой тест:
describe('GET /api/profile/:stationId', () => {
it('Returns response to be defined with status code Ok', async () => {
const url = '/api/profile/1';
const findOneSpy = spyOn(benchProfileService, 'findOne').and.returnValue(Promise.resolve(
{ profile: {}, sessionId: '73892d8c-8479-4e61-a599-c62b5e8afbae', stationId: 1, id: 1}));
request(app)
.get(url)
.end((error, response) => {
console.log(error);
console.log(response.statusCode);
expect(findOneSpy).toHaveBeenCalled();
expect(error).toBeFalsy();
expect(response).toBeDefined();
expect(response.statusCode).toBe(ResponseCodes.Ok);
});
});
});
(Опять отправка только соответствующего кода, всетребуемый импорт был выполнен)
Но когда я запускаю тест, я получаю сообщение об ошибке, что spyon никогда не вызывался, что приводит к тому, что benchProfile будет нулевым (при проверке в консоли), и, следовательно, получит код ошибки (500) вместо OK (200).
Может кто-нибудь сказать мне, как правильно использовать spyon (), или как издеваться над моим «benchProfileService», чтобы обеспечить фиктивную функцию?
Я читал о 'proxyquire', но там говорится, что он используется для удаления зависимостей require (), его можно использовать и здесь?