Моделирование импорта классов машинописи с использованием фермента - PullRequest
0 голосов
/ 07 февраля 2020

Я пытаюсь протестировать этот класс Typescript с помощью Jest (фрагмент, чтобы вы поняли):

import OrderService from '../../../services/api/OrderService';

class InstallationOverview {
  // using OrderService somewhere
  // ...
}

В своем тесте я использую фермент

shallow(<InstallationOverview />);

Я получаю следующую ошибку:

TypeError: Cannot read property 'AUTH_SERVER_URL' of undefined

  1 | class Envs {
  2 | 
> 3 |   static AUTH_SERVER_URL = window["env"]["AUTH_SERVER_URL"];
    |                            ^
  4 |   static AUTH_CLIENT_SECRET = window["env"]["AUTH_CLIENT_SECRET"];
  5 |   static SENSOR_TEST_SERVICE_WS = window["env"]["SENSOR_TEST_SERVICE_WS"];
  6 |   static SENSOR_TEST_SERVICE_URL = window["env"]["SENSOR_TEST_SERVICE_URL"];

  at Object.<anonymous> (src/util/Envs.tsx:3:28)
  at Object.<anonymous> (src/services/SensorTestWebsocketClient.tsx:3:1)
  at Object.<anonymous> (src/redux/reducers/index.js:17:1)
  at Object.<anonymous> (src/redux/store/index.js:2:1)
  at Object.<anonymous> (src/util/NotificationManager.tsx:1:1)
  at Object.<anonymous> (src/services/api/RestService.tsx:2:1)
  at Object.<anonymous> (src/services/api/OrderService.tsx:1:1)
  at Object.<anonymous> (src/content/order/installation/InstallationOverview.tsx:21:1)
  at Object.<anonymous> (src/tests/InstallationOverview.test.jsx:2:1)´´´

Как видите, объект env в окне отсутствует. НО для тестирования класса InstallationOverview мне не нужны все другие сервисы, импортированные OrderService.

Я уже пытался насмехаться над этим с

jest.mock('./src/services/api/OrderService');

, но это не имеет никакого влияния, я думаю, что это применяется ПОСЛЕ обмелевания, поэтому после исключения.

тогда я попытался создать фиктивный файл для OrderService и поместить его в __mocks__ как для теста, так и для целевого класса.

Затем я попытался установить jest config в пакете. json -

"jest": {
   "moduleNameMapper": {
     "OrderService": "<rootDir>/tests/__mocks__/OrderService.tsx"
   }
 }

Однако я перепутал jest и энзим, потому что сейчас не имею понятия, как это работает.

1 Ответ

0 голосов
/ 07 февраля 2020

Использование jest.mock - правильный подход. Начиная с новой версии реакции, я объявил мою папку sr c как папку root, поэтому мне пришлось изменить путь к mock services/api/OrderService, и я переместил вызов mock вне функции it () в класс route

...