我在后端单元测试中使用jest,我需要使用它来模拟第三方库模块方法,我尝试了以下代码:
我的控制器文件:
const edgejs = require('apigee-edge-js');
const apigeeEdge = edgejs.edge;
async get(req, res) {
const abc= await apigeeEdge.connect(connectOptions);
const Details = await abc.developers.get(options);
return res.status(200).send(Details);
}test.spec.js
let edgejs = require('apigee-edge-js');
const ctrl = require('../../controller');
describe("Test suite for abc", () => {
test("should return ...", async() =>{
edgejs.edge = jest.fn().mockImplementationOnce(async () =>
{return {"connect":{"developers":{"get":[{}]}}}}
);
ctrl.get(req, res)
});但是它不是在模仿,而是调用实际的库连接方法。我在这里做错了什么。请分享你的想法。提前谢谢。
工作代码
jest.mock('apigee-edge-js', () => {
return { edge: { connect: jest.fn() } };
});
const edgejs = require('apigee-edge-js');
test("should return ...", async () => {
edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
{"developers":{"get":[{}]}}
));
edgejs.edge.connect()
expect(edgejs.edge.connect).toBeCalled();
})错误代码:
jest.mock('apigee-edge-js', () => {
return { edge: { connect: jest.fn() } };
});
const Ctrl = require('../../controllers/controller'); ----> Extra line
const edgejs = require('apigee-edge-js');
test("should return ...", async () => {
edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
{"developers":{"get":[{}]}}
));
const req = mockRequest();
const res = mockResponse();
await Ctrl.get(req, res) ---> Extra line
expect(edgejs.edge.connect).toBeCalled();
});Receceivig : TypeError: edgejs.edge.connect.mockImplementationOnce不是一个函数
发布于 2020-08-05 10:30:12
模拟不会影响任何东西,因为controller在导入edgejs.edge之后立即取消apigeeEdge = edgejs.edge。如果它使用的是edgejs.edge.connect而不是apigeeEdge.connect,这将是不同的。
方法不应该被模拟为... = jest.fn(),因为这会阻止它们被还原,并且可能会影响之后的其他测试;这就是jest.spyOn的作用所在。此外,edge是一个对象,而不是一个方法。
Jest提供模块模拟功能。第三方库通常需要在单元测试中进行模拟。
它应该是:
jest.mock('apigee-edge-js', () => {
return { edge: { connect: jest.fn() } };
});
const ctrl = require('../../controller');
const edgejs = require('apigee-edge-js');
test("should return ...", async () => {
edgejs.edge.connect.mockImplementationOnce(() => Promise.resolve(
{"developers":{"get":[{}]}}
));
await ctrl.get(req, res)
...
});https://stackoverflow.com/questions/63260760
复制相似问题