如何使用spyOn开玩笑地测试此代码?有人可以为我提供适当的解决方案吗?
.result[0]
我已经尝试过了:
const controller = {};
controller.fetchCars = async (req, res) => {
const result = await getCarsService(req.body);
res.json(result);
};
并给我这个错误:因为它不是一个函数,所以无法监视getCarsService属性。未给定
getCarsService()从/ services导入,看起来像这样:
it('fetchCars should call getCarsService', () => {
const spy = jest.spyOn(carsController, 'getCarsService').mockImplementation(() => {});
const req = {};
const res = {};
carsController.fetchCars(req, res);
expect(spy).toBeCalled()
spy.mockRestore();
});
答案 0 :(得分:1)
最简单的解决方案是将代码分成每个文件,然后仅使用jest.mock
模拟getCarsService方法。
index.js
import getCarsService from './getCarsService';
const controller = {
fetchCars: async (req, res) => {
const result = await getCarsService(req.body);
return res.json(result);
},
};
export default controller;
getCarsService.js
function getCarsService(body) {
return new Promise(resolve => resolve(1));
}
export default getCarsService;
index.spec.js
import controller from './index';
import getCarsService from './getCarsService';
jest.mock('./getCarsService', () => jest.fn().mockResolvedValue(1));
it('fetchCars should call getCarsService', async () => {
const req = {
hello: 'world',
};
const res = {
json: jest.fn(),
};
await controller.fetchCars(req, res);
expect(getCarsService).toBeCalled();
expect(res.json).toBeCalledWith(1);
});
如果您对使用间谍一无所知,可以通过监视默认导出来做到这一点。
import controller from './index';
import * as getCarsService from './getCarsService';
it('fetchCars should call getCarsService', async () => {
const req = {
hello: 'world',
};
const res = {
json: jest.fn(),
};
const spy = jest.spyOn(getCarsService, 'default');
spy.mockResolvedValue(2);
await controller.fetchCars(req, res);
expect(res.json).toBeCalledWith(2);
});