我正在尝试在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()和.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为null(在控制台中检查时),因此得到了错误代码(500)而不是OK(200)。 / p>
有人可以告诉我使用spyon()的正确方法是什么,或者如何模拟我的“ benchProfileService”以提供模拟功能?
我正在阅读有关'proxyquire'的内容,但是它说它用于删除require()依赖关系,也可以在这里使用它吗?