Мокинг интегрированных модулей в хост-приложении для шутки
Фактически, вопрос здесь тот же, но имеет другой контекст: как имитировать не установленный пакет 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.