簡體   English   中英

如何用Jest模擬模塊實例的方法?

[英]How to mock method of instance of module with Jest?

Test-connection.ts文件是:

import { IEnvironmentMap, load } from 'dotenv-extended';
import { getTokensWithAuthCode, sdk } from '../src/connection-manager';

describe('Box API connection tests', () => {

    jest.useFakeTimers();
    let boxConfig: IEnvironmentMap;

    beforeAll(() => {
        boxConfig = load({
            errorOnMissing: true,
        });
    });

    describe('getTokensWithAuthCode function Tests', () => {

        it('should reject a promise if there is wrong auth code provided', async () => {
            jest.mock('box-node-sdk', () => ({
                 getTokensAuthorizationCodeGrant: jest.fn(),
            }));

            await getTokensWithAuthCode();
            expect(sdk.getTokensAuthorizationCodeGrant).toHaveBeenCalled();
       });
   });
});

這是我的主程序文件Connection.ts

import * as BoxSDK from 'box-node-sdk';
import { IEnvironmentMap, load } from 'dotenv-extended';
import {ITokenInfo} from '../typings/box-node-sdk';

const boxConfig: IEnvironmentMap = load({
     errorOnMissing: true,
});

export const sdk: BoxSDK = new BoxSDK({
     clientID: boxConfig.BOX_CLIENT_ID,
     clientSecret: boxConfig.BOX_CLIENT_SECRET,
});

export async function getTokensWithAuthCode() {

    return await new Promise((resolve: (tokenInfo: ITokenInfo) => void, reject: (err: Error) => void) => {

        sdk.getTokensAuthorizationCodeGrant(boxConfig.BOX_AUTH_CODE, null, (err: Error, tokenInfo: ITokenInfo) => {
            if (err !== null) {
                reject(err);
            }

            resolve(tokenInfo);
       });
});
}

jest --coverage ,它會拋出錯誤。 我懷疑這是由於錯誤的模擬。 您能通過玩笑幫助正確實現該模塊的模擬嗎?

模擬本身是正確的,但是順序是錯誤的。 import語句是靜態的,只在頂層懸掛-所以getTokensWithAuthCode與原裝進口的第一box-node-sdk模塊。 然后,模擬不會生效,因為加載的模塊不會刷新內部加載的依賴項。

解決此問題的幾種方法。

  1. 使用babel-jest,將吊裝機模擬到頂層。 那么即使使用import語句,您的模擬文件也會在導入之前被吊起。 例如

     import {getTokensWithAuthCode} ... jest.mock('box-node-sdk' ...); 

    將正確訂購

     jest.mock('box-node-sdk' ...); const {getTokensWithAuthCode} = require(...) //transpiled 

    如果您使用的是TypeScript, ts-jest會為您完成此操作。

  2. getTokensWithAuthCode依賴項后,在每個測試裝置中動態要求getTokensWithAuthCode

兩者都與訂購模擬和真正的導入有關-這里的關鍵是您應該首先使用工具或手動模擬。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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