Функция макета частичного модуля, созданная с помощью Jest, не вызывается тестируемой функцией - PullRequest
0 голосов
/ 09 октября 2018

(На основании примеров, любезно предоставленных уже здесь .) Для модуля ниже,

// fruit.js
export const apple = 'apple';

export const strawberry = () => 'strawberry';

export default () => `banana and ${strawberry()} `;

Я хотел бы написать тест, который проверит, что по умолчанию экспортированная функция корректно вызывает функцию клубника .Чтобы добиться этого, я попытался выполнить следующий тест:

// partial_mock.js
import defaultExport, { strawberry } from '../fruit';

jest.mock('../fruit', () => {
  const originalModule = require.requireActual('../fruit');
  const mockedModule = jest.genMockFromModule('../fruit');

  // Mock the exported 'strawberry' function.
  return Object.assign({}, mockedModule, originalModule, {
    strawberry: jest.fn(() => 'mocked strawberry'),
  });
});

it('does a partial mock', () => {
  expect(strawberry()).toBe('mocked strawberry');

  const defaultExportResult = defaultExport();
  expect(defaultExportResult).toBe('banana and mocked strawberry');
});

Однако макетная функция не вызывается, вместо этого вызывается реальная функция.

 × does a partial mock (21ms)

  ● does a partial mock

    expect(received).toBe(expected) // Object.is equality

    Expected: "banana and mocked strawberry"
    Received: "banana and strawberry "

Ожидается ли это?

Мой тест действителен?Я что-то пропустил в своем тесте?

1 Ответ

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

Происходит то, что к тому времени, когда Jest импортирует fruit.js для генерации макета из него, анонимная функция в вашем экспорте по умолчанию уже захватила ссылку на фактический strawberry в своем закрытии.

Таким образом, все, что делает Jest, это макет strawberry для любых других модулей, которые импортируют его позже, например, для вашего набора тестов.

В этой статье объясняется несколько способов обойти это: https://medium.com/@qjli/how-to-mock-specific-module-function-in-jest-715e39a391f4

Мое предложение состоит в том, чтобы рассмотреть возможность рефакторинга вашей логики, прежде чем использовать какие-либо обходные пути:

  • Некоторые функции в fruit.js служат в качестве деталей реализации или используются для выделения логики?Может быть, вы можете обращаться с ними как с методами закрытого класса и тестировать их через defaultExport.

  • Если их логика настолько независима, что ее необходимо смоделировать между тестами, возможно, функции должныпроживать в отдельных модулях?

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