Модуль Jest Mock для одиночного импорта - PullRequest
0 голосов
/ 27 октября 2018

При использовании jest с модулями ES6 и babel-jest все вызовы jest.mock поднят .
Допустим, я хотел бы смоделировать модуль fs для тестируемого класса, но сохраните исходную реализацию для остальных модулей (например, некоторые утилиты, которые я использую во время теста).
Рассмотрим следующий пример:

class UnderTest {
  someFunction(){
    fs.existsSync('blah');
  }
}

class TestUtility {
  someOtherFunction(){
    fs.existsSync('blahblah');
  }
}

тест:

it('Should test someFunction with mocked fs while using TestUtility'', () => {
  testUtility.someOtherFunction(); // Should work as expected
  underTest.someFunction(); // Should work with mock implementation of 'fs' 
})

Теперь можно ожидать, что при следующем подходе модуль fs будет смоделирован для UnderTest, но не для TestUtility.

import {TestUtility} from './test-utility';

jest.mock('fs');

import {UnderTest } from './under-test';

Однако из-за подъема *Модуль 1021 * будет проверен на все модули (что нежелательно).

Есть ли способ достичь описанного поведения?

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Чтобы отказаться от проверки модуля в тесте jest.doMock(moduleName, factory, options) и jest.dontMock(moduleName).

jest.doMock (moduleName, factory,параметры)

При использовании babel-jest вызовы на mock будут автоматически перемещаться в верхнюю часть блока кода.Используйте этот метод, если хотите явно избежать этого поведения.

jest.dontMock (moduleName)

При использовании babel-jest вызовы на unmock будут автоматическиподнят на вершину блока кода.Используйте этот метод, если вы хотите явно избежать этого поведения.

Так что в вашем случае я бы попробовал что-то вроде

beforeEach(() => {
  jest.resetModules();
});

it('Should test someFunction with mocked fs while using TestUtility'', () => {
  jest.dontMock('fs');
  testUtility.someOtherFunction(); // Should work as expected
  jest.doMock('fs', () => {
    return ... // return your fs mock implementation;
  });
  underTest.someFunction(); // Should work with mock implementation of 'fs' 
})
0 голосов
/ 27 октября 2018

Вы, вероятно, должны использовать Jest's requireActual:

const fs = jest.requireActual('fs'); // Unmockable version of jest 

class TestUtility {
  someOtherFunction(){
    fs.existsSync('blahblah');
  }
}

Из документации :

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

...