Мокинг интегрированных модулей в хост-приложении для шутки

Фактически, вопрос здесь тот же, но имеет другой контекст: как имитировать не установленный пакет npm в шутку?

Я участвую в проекте, в котором используется новая федерация модулей из webpack. По сути, у меня есть хост-приложение, и оно использует удаленные приложения. Я делаю то же самое здесь для маршрутизации: https://github.com/module-federation/module-federation-examples/tree/master/shared-routes2

Мое хост-приложение, импортирующее маршрут удаленных приложений, аналогично (я взял этот пример из репозитория модуля-федерации: https://github.com/module-federation/module-federation-examples/blob/master/shared-routes2/app1/ src / App.js)

      // app1/src/App.js

import React from "react";
import { BrowserRouter, Route, Switch } from "react-router-dom";


import localRoutes from "./routes";
import remoteRoutes from "app2/routes";

const routes = [...localRoutes, ...remoteRoutes];

const App = () => (
  <BrowserRouter>
    <div data-test-id="App-navigation">
      <h1>App 1</h1>
      <React.Suspense fallback={<div>Loading...</div>}>
        <Switch>
          {routes.map((route) => (
            <Route
              key={route.path}
              path={route.path}
              component={route.component}
              exact={route.exact}
            />
          ))}
        </Switch>
      </React.Suspense>
    </div>
  </BrowserRouter>
);

и мой тестовый файл для этого компонента выглядит так:

      // app1/src/App.test.js

import React from 'react';
import { MemoryRouter } from 'react-router-dom';
import { render } from '@testing-library/react';

import App from './App';

jest.mock('app2/routes');

describe('App', () => {
  test('should render navigation', async () => {
    const { findByTestId } = render(
      <MemoryRouter>
        <App />
      </MemoryRouter>,
    );
    const app = await findByTestId('App-navigation');

    expect(drawerMenu).toBeInTheDocument();
  });
});

этот тест выдает ошибку как есть:

      ❯ yarn test App.test.js
yarn run v1.22.10
$ jest App.test.js
 FAIL  src/App.test.js
  ● Test suite failed to run

    Cannot find module 'app2/routes' from 'src/App.test.js'

       6 | import App from './App';
       7 |
    >  8 | jest.mock('app2/routes');
         |      ^
       9 |

      at Resolver.resolveModule (node_modules/jest-resolve/build/index.js:306:11)
      at Object.<anonymous> (src/App.test.js:8:6)

Test Suites: 1 failed, 1 total
Tests:       0 total
Snapshots:   0 total
Time:        3.78 s
Ran all test suites matching /App.test.js/i.
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

Я считаю, что эта ошибка возникает из-за того, что на самом деле нет модуля с именем app2/routes. Это объединенный модуль, созданный плагином объединения модулей webpack. Тем не мение, jest ищет актуальный модуль перед тем, как высмеивать его.

Это та часть, в которой я застрял, и у меня нет идей.

Любая рекомендация высоко ценится.

1 ответ

Jest предлагает виртуальное издевательство, и это решает проблему. (Я нашел решение из этого ответа: /questions/49170748/imitatsiya-dinamicheskogo-trebovaniya-v-node-with-jest/49170763#49170763)

      jest.mock('app2/routes', 
  () => { 
    // some mocking for my remote app routes
  },
  { virtual: true }
);

после того, как вы сделаете фабрику насмешек, вы просто пройдете{ virtual: true }options и шутка перестанут жаловаться на существование модуля.


Этот ответ был опубликован как редактирование вопроса « Издевательство над федеративными модулями в хост-приложении для шутки» OP user5018572 в соответствии с CC BY-SA 4.0.

Другие вопросы по тегам