jest.mock (..) не работает в «description» (TypeError: moduleName.split не является функцией) - PullRequest
1 голос
/ 16 апреля 2020

jest.mock (..) , похоже, не работает на уровне " описания " для моих тестов.

Если у меня есть следующее:

import React from 'react';
import {someFunction} from "./something/someFile";

describe('Overview Test', () => {

    jest.mock(someFunction);

    test(' snapshot', () => {

    });
});

Затем выполнение «теста» (ie. На уровне теста) работает нормально.

Но если я запускаю «описание» (ie. Уровень описания) или на уровне комплекта), то я получаю следующую ошибку:

TypeError: moduleName.split is not a function

    at Resolver.resolveModuleFromDirIfExists (A:\frontend\node_modules\jest-resolve\build\index.js:224:30)
    at Resolver.resolveModule (A:\frontend\node_modules\jest-resolve\build\index.js:252:12)

Если у меня есть это:

describe('Overview Test', () => {
    test(' snapshot', () => {
        jest.mock(someFunction);
    });
});

Тогда в обоих случаях это не работает.

I Я также пробовал это:

import React from 'react';
import {someFunction} from "./something/someFile";


describe('Overview Test', () => {

    beforeEach(() => {
        jest.mock(someFunction);
    });

    test(' snapshot', () => {

    });
});

И это не работает.

ОБНОВЛЕНИЕ

Я также пытался это, и это не работает:

import React from 'react';
import {someFunction} from "./something/someFile";

    describe('Overview Test', () => {

        jest.mock('./something/someFile', () => {
            return { someFunction: jest.fn(() => "futhissit")};
        });

        test(' snapshot', () => {
            someFunction()
        });
    });

1 Ответ

1 голос
/ 23 апреля 2020

Jest mock, если для насмешливых модулей первым аргументом является moduleName, которое должно быть допустимым именем модуля ( внутри node_modules или путем к файлу ), а не прямая функция / модуль:

jest.mock(moduleName, factory, options)

Модулирует модуль с автоматически смоделированной версией, когда это требуется. factory и options являются необязательными.

Ошибка, которую вы получаете TypeError: moduleName.split is not a function, заключается в том, что resolveModuleFromDirIfExists пытается разделить имя / путь модуля, и вы можете посмотрите внутри jest-resolve/src/index.ts в строке 207.

Когда вы хотите протестировать модуль ES, вы передаете расположение модуля для moduleName и создаете factory используя __esModule: true, а затем создайте свойства с макетируемыми экспортированными функциями, используя jest.fn():

someFile.js экспортирует someFunction:

module.exports.someFunction = () => 'Some function result!';

Mocking someFile.js модуль с использованием jest.mock()

describe('Overview Test', () => {

  // Mock the module and its functions
  jest.mock('./someFile', () => ({
    __esModule: true,
    someFunction: jest.fn(() => 'Mocked someFunction!')
  }));

  // Import the function from the mocked module
  const { someFunction } = require('./someFile');

  test('snapshot', () => {
    // Execute the mocked function
    const someResult = someFunction();

    // Expect to return the mocked value
    expect(someResult).toBe('Mocked someFunction!');
  });

});

Вы должны импортировать модулированные модули после проверки jest.mock модуля. Вы можете создать jest.setup.js и настроить его, используя setupFilesAfterEnv, в котором могут быть ваши макеты, а затем просто импортируйте модули, как обычно, вверху тестовых файлов.

...