Как смоделировать напрямую импортированную функцию с помощью Jest? - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь убедиться, что мой метод правильно вызывает другой импортированный метод. На самом деле, я не могу понять, как издеваться над импортированным методом с помощью Jest.

Метод, который я хочу проверить

LandingPageManager.ts

import {getJSON} from './getJSON';

public fetchData(url: string) {
    getJSON(url);
}

Метод, который я хочу издеваться

getJSON.ts

export function getJSON(url: string) {
    // XHR requests logic 
}

Метод испытания

LandingPageManager.test.ts

import 'jest';
import {getJSON} from '../../../src/web/getJSON';
import {LandingPageManager} from '../../../src/web/LandingPageManager';

describe('fetchData', () => {
  let manager = new LandingPageManager();
  it('passes the correct URL to getJSON', () => {
    const getJsonSpy = jest.mock('../../../src/web/getJSON', jest.fn());

    manager.fetchData('sampleValue');
    expect(getJsonSpy).toHaveBeenCalledWith('sampleValue');

    getJsonSpy.restoreAllMocks();
  });
});

Ошибка, которую я получаю

 jest.fn() value must be a mock function or spy

Я пытался настроить макет разными способами. Но я не могу понять синтаксис правильно.

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

1 Ответ

0 голосов
/ 16 января 2019

Наконец-то разобрался с ответом.

Ничего не нужно менять в исходном коде (импортированный модуль или тестируемый класс).

Импорт необходимо изменить с:

import {getJSON} from '../../../src/web/getJSON';

до:

import * as getJSON from '../../../src/web/getJSON';

И тогда я смог напрямую указать функцию для шпионажа:

const jsonSpy = jest.spyOn(getJSON, 'getJSON');

Исправлен тестовый случай

Вот как теперь все это работает вместе.

LandingPageManager.test.ts

import 'jest';
// **** 1.) Changed the below line: ****
import * as getJSON from '../../../src/web/getJSON';
import {LandingPageManager} from '../../../src/web/LandingPageManager';

describe('fetchData', () => {
  let manager = new LandingPageManager();
  it('passes the correct URL to getJSON', () => {
    // **** 2.) Can now specify the method for direct mocking ****
    const jsonSpy = jest.spyOn(getJSON, 'getJSON');

    manager.fetchData('sampleValue');
    expect(getJsonSpy).toHaveBeenCalledWith('sampleValue');

    getJsonSpy.restoreAllMocks();
  });
});
...