[英]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
模塊。 然后,模擬不會生效,因為加載的模塊不會刷新內部加載的依賴項。
解決此問題的幾種方法。
使用babel-jest,將吊裝機模擬到頂層。 那么即使使用import語句,您的模擬文件也會在導入之前被吊起。 例如
import {getTokensWithAuthCode} ... jest.mock('box-node-sdk' ...);
將正確訂購
jest.mock('box-node-sdk' ...); const {getTokensWithAuthCode} = require(...) //transpiled
如果您使用的是TypeScript, ts-jest
會為您完成此操作。
getTokensWithAuthCode
依賴項后,在每個測試裝置中動態要求getTokensWithAuthCode
。
兩者都與訂購模擬和真正的導入有關-這里的關鍵是您應該首先使用工具或手動模擬。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.