Jest ‘spyOn’ машинописный класс без перезаписи его свойств и функций

#typescript #jestjs #mocking #ts-jest

#машинописный текст #jestjs #насмешливый #тс-шутка

Вопрос:

Кто-нибудь знает, как я могу spyOn использовать весь класс (конструктор и все методы), не перезаписывая все (шутка 26.6.3)?

В настоящее время я пытаюсь шпионить (а не издеваться) за моей средой выполнения, и я только хочу проверить, правильно ли она была создана Agile:

 import {
  Agile,
  Runtime,
} from "../../src";
jest.mock("../../src");

// ..

const RuntimeMock = Runtime as jest.MockedClass<typeof Runtime>;

// ..

const agile = new Agile();
expect(RuntimeMock).toHaveBeenCalledWith(/* ... */)

// ..
 

но все функции свойств среды выполнения перезаписываются Jest, так что он вообще не создается.

Есть ли способ получить поведение, подобное spyOn методу, но с целым классом, потому что я только хочу проверить, правильно ли вызван конструктор среды выполнения в Agile классе expect(RuntimeMock).toHaveBeenCalledWith(/* ... */)

Возможно, это проблема с моей логикой импорта, потому что я импортирую все классы из одного модуля internal.ts , и из-за этого, возможно, Jest не может правильно воссоздать классы, но я не знаю (https://github.com/agile-ts/agile/blob/tests/rewrite-tests/packages/core/src/internal.ts ).

Комментарии:

1. В Jest нет такой функциональности, и нет простого и безопасного способа ее реализации. Часто, когда вам нужно утверждать, что функция была вызвана, издевательство над ней приведет к лучшему тестированию, так что это крайний случай. Класс сам по себе является конструктором, поэтому слежка за ним разрушит цепочку прототипов, если существует иерархия классов, она будет нарушена. То, что вы хотите, чтобы он был полностью отслежен, указывает на проблему с методом тестирования, следите только за тем, что нужно отслеживать. Если вам когда-нибудь понадобится подсмотреть за конструктором, это можно сделать с помощью jest.fn, который возвращает реальный экземпляр.

2. Когда jest.mock используется без второго аргумента и соответствующего __mocks__ файла, он заглушает класс, поэтому он работает так, как ожидалось.

3. хорошо, спасибо.. вы правы.. он работает довольно хорошо.. моя проблема заключалась в том, что один класс из 5 отбрасывает неожиданную проблему, из-за чего я думал, что он вообще не работает.. И в конкретном классе он не смог найти статическое свойство после издевательства над классом .. но нестатический материал работает довольно хорошо.. вы знаете, есть ли решение для этого? Спасибо; D

4. Вот как работает Jest automocking. Это делает какую-то магию, которая не документирована. Если вам нужен макет, который работает определенным образом, тогда используйте ручные макеты.

5. хорошо .. я только хочу, чтобы некоторые статические свойства возвращали некоторые статические числа вместо неопределенных; D Но в любом случае спасибо за помощь