Насмешка над модулем узла в шутливом тесте - PullRequest
1 голос
/ 21 января 2020

У меня есть Jest-тест, который я пишу для функции, которая выполняет вызов API. Если вызов API возвращает 403, должна быть вызвана функция из модуля узла. Я пытаюсь проверить это с помощью фиктивной шутливой функции, но не могу заставить тест использовать версию макета, которую я делаю.

file.spe c. js

import file from './file'

const mockedNodeModule = jest.genMockFromModule('nodeModule')
mockedNodeModule.namedExport = { logout: jest.fn() }

it('call returns a 403', async () => {
      await file.apiCall('brand', 'entityType', 'name')
      expect(mockedNodeModule.namedExport.logout).toHaveBeenCalled()
})

file. js

import { namedExport } from './nodeModule';
import api from './api';

const apiCall = () => {
  return api.makeCall().then(
    () => {},
    (error) => {
      if (error.status === 403) {
        namedExport.logout();
      }
    },
  );
};

export default { apiCall };

Проверка всегда не проходит, когда я проверяю, был ли вызван mockedNodeModule.namedExport.logout. Когда я помещаю точку останова в строку, которую она вызывает, кажется, что проверенная версия не используется во время выполнения теста (т.е. она все еще использует модуль из моих node_modules). Я также пытался использовать jest.mock (), но результат тот же. Что-то не так в том, как я настраиваю тест? Может ли шутка не издеваться над модулями узлов в подобных случаях?

1 Ответ

1 голос
/ 21 января 2020

jest.mock (moduleName, factory, options) должно работать.

Например,

file.js:

import { namedExport } from './nodeModule';
import api from './api';

const apiCall = () => {
  return api.makeCall().then(
    () => {},
    (error) => {
      if (error.status === 403) {
        namedExport.logout();
      }
    },
  );
};

export default { apiCall };

api.js:

function makeCall() {}

export default { makeCall };

nodeModule.js:

export const namedExport = {
  logout() {
    console.log('real implementation');
  },
};

file.test.js:

import file from './file';
import api from './api';
import { namedExport } from './nodeModule';

jest.mock('./nodeModule', () => {
  const mNamedExport = {
    logout: jest.fn(),
  };
  return { namedExport: mNamedExport };
});

jest.mock('./api', () => {
  return { makeCall: jest.fn() };
});

describe('59831697', () => {
  afterEach(() => {
    jest.clearAllMocks();
  });
  it('should handle error if http status equal 403', async () => {
    const mError = { status: 403 };
    api.makeCall.mockRejectedValueOnce(mError);
    await file.apiCall();
    expect(namedExport.logout).toHaveBeenCalledTimes(1);
  });
});

Результаты модульных испытаний с отчетом о покрытии:

 PASS  src/stackoverflow/59831697/file.test.js (13.506s)
  59831697
    ✓ should handle error if http status equal 403 (7ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |       50 |    66.67 |      100 |                   |
 file.js  |      100 |       50 |    66.67 |      100 |                 8 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        15.448s

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59831697

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...