Вопрос:

Как смоделировать метод экземпляра модуля с помощью Jest?

javascript typescript jestjs

456 просмотра

1 ответ

214 Репутация автора

Файл 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, это бросает ошибку. Я подозреваю, что это из-за неправильной насмешки. Можете ли вы помочь с правильной реализацией макета для этого модуля с шуткой?

Автор: badal16 Источник Размещён: 11.01.2018 07:05

Ответы (1)


3 плюса

2459 Репутация автора

Решение

издевательство само по себе правильно, но порядок неверен. importОператор статичен и поднят только на верхнем уровне - поэтому getTokensWithAuthCodeсначала импортируется с оригинальным box-node-sdkмодулем. Тогда насмешка не будет действовать, так как загруженный модуль не обновляет внутренне загруженные зависимости.

Пара способов решить это.

  1. с помощью бабел шутка, поднять насмешку на высший уровень. тогда даже с оператором импорта, ваш макет будет поднят перед импортом. например

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

    будет правильно заказан в

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

    ts-jest делает это для вас, если вы используете TypeScript.

  2. Динамически требуется getTokensWithAuthCodeв каждом тестовом приспособлении после проверки ваших зависимостей.

Обе они касаются упорядочивания макетов и реального импорта - главное, что вы должны сначала сделать макет, используя инструмент или вручную.

Автор: OJ Kwon Размещён: 11.01.2018 11:42
Вопросы из категории :
32x32