【发布时间】:2017-11-08 18:06:09
【问题描述】:
我开玩笑地写了一个测试来测试我的一个中间件。
const asyncAll = (req, res, next) => {
const queue = [
service.exchangeLongTimeToken(req),
service.retrieveUserInfo(req),
];
Promise.all(queue).then((values) => {
res.locals.auth = values[0];
res.locals.user = values[1];
next();
}).catch((err) => {
next(err)
});
};
测试文件是这样的:
const httpMocks = require('node-mocks-http');
const testData = require('../../testdata/data.json');
describe('Test asyncAll', () => {
let spy1 = {};
let spy2 = {};
const mockNext = jest.fn();
afterEach(() => {
mockNext.mockReset();
spy1.mockRestore();
spy2.mockRestore();
});
test('Should call next() with no error when no error with 2 requests', () => {
spy1 = jest.spyOn(service, 'exchangeLongTimeToken').mockImplementation((url) => {
return Promise.resolve(testData.fbLongTimeToken);
});
spy2 = jest.spyOn(service, 'retrieveUserInfo').mockImplementation((url) => {
return Promise.resolve(testData.fbUserInfo);
});
const request = httpMocks.createRequest();
const response = httpMocks.createResponse();
asyncAll(request, response, mockNext);
expect(spy1).toBeCalled();
expect(spy2).toBeCalled();
expect(mockNext).toBeCalled();
expect(mockNext).toBeCalledWith();
expect(mockNext.mock.calls.length).toBe(1);
});
}
错误是这样的:
错误:expect(jest.fn()).toBeCalled()
预期的模拟函数已被调用。
at Object.<anonymous> (tests/backend/unit/fblogin/asyncAll.test.js:39:26)
这反映了这条线:
expect(mockNext).toBeCalled();
为什么它没有被调用?
我阅读了有关 jest 的文档,它说我需要返回承诺才能测试该值。但是asyncAll() 没有返回一个promise,而是消耗了一个promise,如何处理呢?
【问题讨论】:
标签: javascript unit-testing promise mocking jestjs