[英]Jest Spy says function is not called
我可以說函數sendResponse
被調用,因為執行了sendResponse
中的console.log行。 但是,我的間諜說沒有調用sendResponse
方法。 只是想知道我在做什么錯。
import * as ExpressHelpers from './express-helper';
describe('sendResponse', () => {
it('sends a 500 error response', () => {
const sendResponseSpy = spyOn(ExpressHelpers, 'sendResponse');
const mockResponse = () => {
const res: any = {};
res.status = jest.fn().mockReturnValue(res);
res.send = jest.fn().mockReturnValue(res);
return res;
};
const errorMsg = 'Server error msg';
const res = mockResponse();
ExpressHelpers.sendServerError(errorMsg, res);
expect(sendResponseSpy).toHaveBeenCalled();
});
});
export function sendResponse(statusCode: HttpStatus, message: string, data: {}, response: Express.Response) {
const responseEntity: ResponseEntity = {
message,
statusCode,
data,
};
response.send(responseEntity);
}
export function sendServerError(serverErrorMsg: string, res: Express.Response) {
sendResponse(HttpStatus.SERVER_ERROR, serverErrorMsg, null, res);
}
錯誤:
● Express Helper › sendResponse › sends a 500 error response
expect(spy).toHaveBeenCalled()
Expected spy to have been called, but it was not called.
35 | const res = mockResponse();
36 | ExpressHelpers.sendServerError(errorMsg, res);
> 37 | expect(sendResponseSpy).toHaveBeenCalled();
| ^
38 | });
39 | });
40 | });
at Object.it (src/helpers/express-helper.test.ts:37:37)
Jest本身無法在ES模塊上運行,您的代碼被Babel或TSC進行了轉譯,然后被加載以執行。 這種轉換的結果是,您導出的函數引用現在已綁定到“導出”對象,該對象在源代碼中不可見,但存在於正在運行的代碼中。
調用spyOn時,將監視'exports'對象(exports.sendResponse)對象內的引用,但不會監視函數調用內的引用(sendResponse)。 一種解決方案是將您的所有功能綁定到這樣的某些導出對象
function foo() { namespace.bar() }
function bar() {}
const namespace = {
foo,
bar
}
export default namespace;
如果感覺像黑客一樣,您可以使用帶有靜態方法的類來達到幾乎相同的效果。 看起來jest在不遠的將來會獲得ESM支持( https://github.com/facebook/jest/issues/4842 ),所以這將是更簡單的解決方案之一。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.