Jest - не может изменить mockImplementation после импорта модуля - PullRequest
0 голосов
/ 25 сентября 2019

Я не могу изменить фиктивное поведение функции в другой функции после того, как последняя импортирована в мой тестовый модуль.«functionUsingMockFunction» вызывает «mockFunction» и должен что-то делать со своим возвращаемым значением.Однако, когда тест настроен, как показано ниже, он терпит неудачу, потому что «mockFunction» возвращает неопределенное значение.Кроме того, я могу изменить mockImplementation зависимостей npm, где бы я ни хотел, но я не могу легко смоделировать функции, экспортируемые в мои собственные модули."jest.resetModules ()" в beforeEach тоже не работает.

jest.mock("../moduleToMock");
const { mockFunction } = require("../moduleToMock");
// if mockFunction.mockImplementation was defined here, it would work
const { functionUsingMockFunction } = require("./someModule");
...
let result;
beforeEach(async () => {
        mockFunction.mockImplementation(() => ({
          // return some object
        }));
        // if functionUsingMockFunction was imported now, it would also work
        result = await functionUsingMockFunction();
      });
      it("does something", () => {
        expect(result).toEqual("some result");
      });
});

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

"devDependencies": {
    "@babel/core": "^7.0.0",
    "@babel/plugin-proposal-class-properties": "^7.0.0",
    "@babel/preset-env": "^7.4.4",
    "@babel/preset-react": "^7.0.0",
    "babel-core": "7.0.0-bridge.0",
    "babel-eslint": "^10.0.0",
    "babel-jest": "24.8.0",
    "babel-loader": "^8.0.0",
    "clean-webpack-plugin": "^1.0.0",
    "concurrently": "^4.0.0",
    "css-loader": "^2.0.0",
    "enzyme": "^3.9.0",
    "enzyme-adapter-react-16": "^1.12.1",
    "eslint": "^5.16.0",
    "eslint-config-airbnb": "^17.0.0",
    "eslint-plugin-import": "^2.11.0",
    "eslint-plugin-jest": "^22.5.1",
    "eslint-plugin-jsx-a11y": "^6.0.3",
    "eslint-plugin-react": "^7.7.0",
    "file-loader": "^3.0.0",
    "html-webpack-plugin": "^3.2.0",
    "jest": "24.8.0",
    "nodemon": "^1.17.3",
    "react-test-renderer": "^16.8.6",
    "style-loader": "^0.23.0",
    "url-loader": "^1.0.1",
    "webpack": "^4.5.0",
    "webpack-cli": "^3.0.8",
    "webpack-dev-server": "^3.1.3"
  }

Конфигурация:

// babel.config.js
module.exports = {
  presets: ["@babel/preset-env", "@babel/preset-react"],
  plugins: ["@babel/plugin-proposal-class-properties"]
};

// jest.config.js
module.exports = {
  setupFilesAfterEnv: ["./test/setupTests.js"],
  moduleNameMapper: {
    "\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$":
      "<rootDir>/__mocks__/fileMock.js",
    "\\.(css|less)$": "<rootDir>/__mocks__/styleMock.js"
  }
};

// setupTests.js
import { configure } from "enzyme";
import Adapter from "enzyme-adapter-react-16";
import "babel-polyfill";

configure({ adapter: new Adapter() });
...