簡體   English   中英

開玩笑間諜說函數不被調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM