Перейти к содержимому

Справочник API ​

Здесь собраны все экспорты пакета, по путям импорта. В каждой строке одной фразой сказано, что делает экспорт, и дана ссылка на страницу с примерами и опциями. Если библиотека вам в новинку, начните с введения; незнакомые слова объяснены в глоссарии.

Первый пример ​

Соберите из класса объект со спаями, задайте ответ одного метода и проверьте результат.

ts
import 'vitest-auto-spy/rxjs';

import { expect, it } from 'vitest';
import { createSpyFromClass, expectEmission } from 'vitest-auto-spy';

import { UserService } from './user.service';

it('answers with the user', async () => {
  const users = createSpyFromClass(UserService); // load(id: number): Observable<User>
  users.load.nextWith({ id: 1, name: 'Ada' });

  const user = await expectEmission(users.load(1));

  expect(user).toEqual({ id: 1, name: 'Ada' });
  expect(users.load).toHaveBeenCalledWith(1);
});

createSpyFromClass берётся из ядра. nextWith — хелпер управления, его вызывают на методе-спае. expectEmission ждёт первое значение потока.

import 'vitest-auto-spy/rxjs' включает nextWith и остальные хелперы для Observable. Без него nextWith бросает Observable spies require rxjs. Импорт вынесен отдельно, чтобы проекты без rxjs его не загружали. Поставьте его в начало каждой спеки, где он нужен, или один раз в setup-файл (setupFiles в конфиге Vitest).

В спеке с Angular TestBed спай подставляет provideAutoSpy, а injectSpy достаёт его обратно с типом Spy<UserService>. Оба берутся из vitest-auto-spy/angular:

ts
import 'vitest-auto-spy/rxjs';

import { TestBed } from '@angular/core/testing';
import { expect, it } from 'vitest';
import { injectSpy, provideAutoSpy, stable } from 'vitest-auto-spy/angular';

import { ProfileComponent } from './profile.component';
import { UserService } from './user.service';

it('loads the user', async () => {
  TestBed.configureTestingModule({
    imports: [ProfileComponent],
    providers: [provideAutoSpy(UserService)],
  });
  const users = injectSpy(UserService);
  users.load.nextWith({ id: 1, name: 'Ada' });

  const fixture = TestBed.createComponent(ProfileComponent);
  await stable(fixture);

  expect(users.load).toHaveBeenCalledTimes(1);
});

stable ждёт, пока компонент отрисуется, и с zone.js, и без него. Ответ можно задать и прямо в провайдере: provideAutoSpy(UserService, { returns: { load: of({ id: 1, name: 'Ada' }) } }), где of берётся из rxjs. Метод в обоих случаях остаётся спаем, так что nextWith может поменять ответ позже.

Какой путь импорта выбрать ​

Каждый путь импорта — это точка входа. Выберите строку своего раннера:

Вы тестируете наСпаи импортируйте изДля фреймворка добавьте
Vitestvitest-auto-spy/angular, /nestjs, /vue, /react, /svelte
Bunvitest-auto-spy/bun/bun-angular для Angular
node:testvitest-auto-spy/node/nestjs
Rstestvitest-auto-spy/rstest/nestjs
Методы или свойства с Observableещё vitest-auto-spy/rxjs (см. выше)—
Angular, помимо спаев/angular и /angular/matchers, /angular/doubles, …другие точки входа Angular

На Bun, node:test и Rstest импортируйте точку входа раннера раньше любого другого импорта из vitest-auto-spy: чья мок-функция достанется спаям, решает первая импортированная точка входа. На Vitest порядок не важен.

Откуда можно импортировать createSpyFromClass и другие фабрики ядра:

  • Ещё из этих точек входа: /bun, /node, /rstest, /react, /svelte, /vue, /bun-angular. В них есть всё, что экспортирует vitest-auto-spy, поэтому хватает одной строки импорта.
  • Ни из какой другой точки входа, включая /angular и /nestjs. Спеке, которая берёт provideAutoSpy из /angular, импорт vitest-auto-spy не нужен. Если спека ещё и вызывает createSpyFromClass, строк импорта будет две. Кое-что из ядра /angular всё же реэкспортирует: тип Spy<T>, хелперы mock*Prop и проверки Observable.

vitest-auto-spy ​

Ядро. Импорт подключает спаи к мок-функции Vitest (адаптер раннера).

Собрать спай или подмену ​

ЭкспортЧто делаетГде подробно
createSpyFromClass(Class, methodsOrConfig?)Собирает типизированный Spy<T>: каждый метод класса становится спаемСпаи из класса
createSpyFromInstance(instance, methodsOrConfig?)Превращает в спаи методы уже существующего объекта, прямо на нёмСпаи на живом объекте
restoreSpiedInstance(instance)Возвращает этому объекту настоящие методытам же
spyOnOwnMethod(instance, method)Записывает вызовы одного метода тестируемого объекта и по-прежнему вызывает настоящий; замена vi.spyOnОдин метод
spyOnVoidMethod(target, method)Записывает вызовы одного нативного void-метода (preventDefault, focus) без броска строгого режимаСпаи из класса
createAutoMock<T>(overrides?, config?)Собирает Spy<T> по типу или интерфейсу, без классаПо типу
autoMocked<T>(overrides?, config?)То же, но с типом сразу T и Spy<T>, для let, который задают в beforeEachОдин объект, два типа
createMock<T>(partial?)Собирает обычный T без спаев — для данных, а не для зависимостейПо типу, без спаев
mockDeep<T>(overrides?, options?)Подмена, где a.b.c — спай на любой глубине, без настройкиГлубокие подмены
createFunctionSpy(name, unstubbed?)Один отдельный спай-функция со всеми хелперами; тип — FunctionSpy<Fn>Одна функция
createSpyClass(Class, config?, options?)Спай, который можно вызвать через new; записывает calls и instancesВызов через new
mockConstructor(factory, name?)Подмена конструктора для класса, который тестируемый код создаёт через newПодмены конструкторов
stubConstructor(target, property, factory)Ставит такую подмену вместо глобального или модульного класса и снимает её после тестатам же
registerAutoSpyDefaults(Class, config)Один раз регистрирует обычную настройку класса; с неё начинается каждый спай этого классаНастройка по умолчанию
clearAutoSpyDefaults(Class?)Снимает одну регистрацию или все сразутам же
clearAutoSpy(spy)Очищает записанные вызовы у всех спаев объекта; заданные ответы остаютсяСброс
resetAutoSpy(spy)Очищает и вызовы, и настройку, как vi.resetAllMocks()там же

Хелперы управления по типу возврата ​

Спай метода получает те хелперы, которые допускает его тип возврата. Это методы самого спая (users.load.nextWith(...)), а не отдельные экспорты. Хелперы для Observable работают после import 'vitest-auto-spy/rxjs'.

МетодХелперыГде подробно
возвращает значениеmockReturnValue и родной API моков раннера, calledWith(...), mustBeCalledWith(...), once(), times(n)Синхронные методы
любой методfailWith(error): бросает на каждом вызове или только для аргументов цепочки calledWithБросить ошибку
возвращает Promise<T>resolveWith, rejectWith, resolveWithPerCall; исходы попадают в mock.settledResultsМетоды с Promise
возвращает Observable<T>nextWith, nextOneTimeWith, nextWithValues, nextWithPerCall, throwWith, complete, returnSubjectМетоды с Observable

calledWith принимает асимметричные матчеры вроде expect.any(Number) на любой глубине; см. что считается тем же аргументом.

Свойства ​

ЭкспортЧто делаетГде подробно
mockReadonlyProp(object, property, value)Задаёт readonly-свойство на один тестПодмена свойств
mockReadonlyPropGetter(object, property, getter)То же, через функцию-геттертам же
mockValueProp(object, property, value)Задаёт записываемое свойство на один тестЗаписываемые свойства
mockAccessorsProp(object, property, accessors?)Подменяет пару геттер и сеттерПодмена свойств
restoreMockedProps()Откатывает все патчи mock*Prop (и заглушки, которые с ними регистрируются)Гигиена прогона
countMockedProps()Сколько патчей ещё стоиттам же
reportPropsOutsideHooks(reaction)Сообщает о патче вне теста или хука, без setupAutoSpyтам же

Проверки Observable ​

Каждая сама подписывается на поток и падает с понятным сообщением, если поток молчит.

ЭкспортЧто делаетГде подробно
expectEmission(source$, options?)Ждёт одно значение и возвращает егоПроверки Observable
expectEmissions(source$, count, options?)Ждёт count значений и возвращает ихтам же
expectAllEmissions(source$, options?)Возвращает все значения, когда поток завершитсятам же
expectNoEmission(source$, options?)Проходит, если за время ожидания ничего не пришлотам же
expectNoEmissionSync(source$, options?)Та же проверка, но без awaitТишина без await
expectCompletion(source$, options?)Проходит, если поток завершился, со значением или безПроверка завершения
expectError(source$, options?)Проходит, если поток упал с ошибкой, и возвращает еёПроверка ошибки
setEmissionTimeout(milliseconds)Меняет время ожидания по умолчанию для всех этих проверокПроверки Observable

Типизация, фикстуры и аргументы ​

ЭкспортЧто делаетГде подробно
asInstance(spy) / asSpy(instance)Показывает Spy<T> как T или T как Spy<T> вместо as anyТипизация спаев
asInstances(...spies)asInstance для целого списка аргументовСписок аргументов
innerDouble(double, method)Спай, которым отвечает метод из returnsClass, без вызова этого методаreturnsClass
outOfType<T>(value)Намеренно чужое для T значение (null, который шлёт бэкенд), с типом TТипизация спаев
createFixture<T>(defaults, overrides?)Свежий T из полного значения по умолчанию и правок этого тестаФикстуры
createFixtureFactory<T>(defaults)Возвращает (overrides?) => T поверх одного значения по умолчаниютам же
withOverrides(model, overrides?)Фикстура из экземпляра модели; её геттеры читаются один раз, как данныетам же
narrow(value, predicate)Ветка объединения, которую ждёт тест; при промахе показывает настоящую форму; есть .byKey, .defined, .observable, .instanceOfтам же
captureArg<T>(options?)Ловит аргумент, который собрал тестируемый код, чтобы проверить его потомРецепты
createLog<T>()Один журнал порядка вызовов, в который пишут несколько зависимостейЖурнал вызовов

Модули и цикл событий ​

ЭкспортЧто делаетГде подробно
assertMocked(namespace, options?)Падает, если vi.mock(), на который рассчитывает спека, не сработалМоки модулей
moduleNamespace(exports, options?)Объект, который должна вернуть фабрика vi.mock (default + __esModule)там же
adoptMock(mock, options?)Превращает мок раннера из фабрики vi.mock в типизированный спай-функциютам же
flushEventLoop(turns?)Прокручивает настоящие обороты цикла событий, даже под фейковыми таймерамиЦикл событий
flushEventLoopUntil(isDone, options?)Крутит обороты, пока условие не выполнится, с лимитом вместо зависаниятам же
settleDynamicImport(load, turns?)Дожидается import(), который запустил тестируемый кодтам же

Диагностика в ядре ​

ЭкспортЧто делаетГде подробно
errorHandlerОбъект, чей throwArgumentsError собирает сообщение о провале mustBeCalledWithХелперы управления
describeDuplicateCopies() / getPackageCopies()Называют копии этого пакета, загруженные в один процессГигиена прогона

Точки входа раннеров ​

Они реэкспортируют всё ядро и регистрируют адаптер своего раннера вместо адаптера Vitest.

ИмпортЧто добавляетГде подробно
vitest-auto-spy/buncreateNestUnit (из /nestjs)Bun
vitest-auto-spy/nodecreateNestUnit; trackNodeMocks(), pruneNodeMocks(), countNodeMocks() освобождают спаи, которые держит node:testnode:test
vitest-auto-spy/rstestничегоRstest
vitest-auto-spy/reactничего; те же экспорты, что у vitest-auto-spy, под именем для ReactReact
vitest-auto-spy/svelteничего; то же самое под именем для SvelteSvelte
vitest-auto-spy/vueprovideAutoSpy для global.provide и спаи сторов PiniaVue

vitest-auto-spy/rxjs ​

Импортируйте его в каждой спеке, где он нужен, или один раз в setup-файле. Импорт включает хелперы для Observable и observablePropsToSpyOn, а в типах превращает результат returnSubject() в Subject<T> из rxjs.

ЭкспортЧто делаетГде подробно
createObservableWithValues(configs, options?)Собирает Observable из списка ValueConfigrxjs

vitest-auto-spy/angular ​

Хелперы для Angular TestBed на Vitest. Импорт import { … } from 'vitest-auto-spy' рядом с ним не нужен; import 'vitest-auto-spy/rxjs' для nextWith всё равно нужен. Обычная спека импортирует import { injectSpy, provideAutoSpy, type Spy } from 'vitest-auto-spy/angular';.

ЭкспортЧто делаетГде подробно
provideAutoSpy(Class, methodsOrConfig?)Провайдер TestBed, который выдаёт спай вместо сервисаПодменить сервис
injectSpy(token)Получает этот спай из TestBed с типом Spy<T>там же
provideAutoSpyForToken(token, overrides?, config?)То же для InjectionToken; спай собирается по типу токенаТокены
registerAutoSpyDefaults / clearAutoSpyDefaultsРегистрация из ядра, которая принимает и InjectionTokenНастройка по умолчанию
extendWithAutoSpies(test, spec, options?)Типизированные фикстуры test для набора зависимостей (Vitest 4.1+)Фикстуры теста
createWithAutoSpies(Class, options?)Создаёт класс через DI, подменяя спаями все зависимости без провайдераЗависимости-спаи
renderShallow(Component, options?)Рендерит компонент без дочерних компонентов (поверхностный рендер)Поверхностный рендер
prepareShallow(Component, options?)renderShallow с общими для всех тестов опциями; .create(overrides?) в каждом тестеОбщие опции рендера
createComponentStub(Class, overrides?, options?)Standalone-заглушка дочернего компонента, директивы или пайпаЗаглушка дочернего компонента
createDirectiveHost(options)Standalone-хост для тестируемой директивыХост директивы
setInputs(fixture, inputs, options?)Задаёт инпуты по алиасу или имени поля и ждёт стабильности фикстурыСмена инпута
hostElement(fixture, Type?) / queryElement(fixture, selector, Type?)Элемент-хост или найденный элемент, типизированный и проверенный через instanceofТипизированные элементы
stable(fixture, options?) / flushEffects()Ждёт компонент: прогоняет эффекты и ждёт, пока у фикстуры не останется незавершённой работы; с zone.js и без негоОжидание в zoneless
settleResource(resource, options?)Ждёт, пока resource() или httpResource() выйдет из loadingРесурсы
mockResourceProp(object, property, initial, options?)Подменяет свойство-ресурс подменой ResourceRef, которой управляет спекаРесурс без запроса
mockSignalProp(object, property, initial)Управляет свойством-сигналом через настоящий записываемый сигналУправление сигналом
mockSignalProps(object, values)Задаёт несколько сигналов подмены стора одним вызовомтам же
runEffect(effectRef)Выполняет тело одного effect() прямо сейчасОдин эффект
trackRecomputations(signal) / trackEffectRuns(effectRef)Считает пересчёты computed() или запуски effect()Подсчёт запусков
overrideAutoSpy(Class, methodsOrConfig?)Подменяет провайдер во всём TestBed, включая провайдеры компонентовПереопределения
overrideComponentProvider(Component, Class, methodsOrConfig?)Подменяет провайдер, который компонент объявил для себятам же
assertNgModuleScopes(...modules) / assertComponentDefIntact(...components)Проверяют, что определение модуля или компонента пережило компиляциютам же
trackInjections(tokens, options?)Записывает, какие зависимости тестируемый код запросил у DIОтслеживание инъекций
setupAngularTestEnv(options)Запускает zone- и zoneless-спеки в одном воркереZone и zoneless вместе
Spy, хелперы mock*Prop, restoreMockedProps, countMockedProps, семейство expect*Emission*, expectError, setEmissionTimeoutРеэкспорт из ядраЯдро

vitest-auto-spy/angular/matchers ​

Только Vitest. Вызовите каждую регистрацию один раз в setup-файле. Ядро не реэкспортирует.

ЭкспортДобавляет матчерГде подробно
registerSignalMatchers(options?)toHaveSignalValue(value); { strict: true } сравнивает как toStrictEqualПроверка сигнала
registerResourceMatchers()toBeLoading, toHaveResourceValue, toHaveResourceErrorПроверка ресурса
registerDirectiveMatchers()toHaveDirectiveApplied(Directive, selector?) на фикстуреМатчер директивы

vitest-auto-spy/angular/doubles ​

Готовые подмены сервисов Angular и Material. Регистрирует адаптер Vitest; ядро не реэкспортирует. @angular/material и @angular/cdk не становятся зависимостями: их классы вы передаёте сами.

ЭкспортЧто делаетГде подробно
provideWindowDouble(token, overrides?) / createWindowDouble(overrides?)window с вашими правками поверх настоящего; create* работает без TestBedWindow и document
provideDocumentDouble(overrides?, token?) / createDocumentDouble(overrides?)То же для documentтам же
provideMatDialogData(token, data)Данные диалога для DI с типом по токенуДиалог Material
provideMatDialogRef(RefClass, init?) / injectMatDialogRef(RefClass, injector?) / createMatDialogRef(RefClass, init?)Ссылка на диалог: спай close, emitClose(result?), afterClosed()там же
providePlatform(platform, flags?)PLATFORM_ID и ваши флаги платформы, согласованные между собойПлатформа и другие подмены
provideDomSanitizerDouble() / createDomSanitizerDouble()DomSanitizer, чьи bypass-спаи возвращают настоящие безопасные значениятам же
provideChangeDetectorRefDouble() / createChangeDetectorRefDouble()ChangeDetectorRef из четырёх спаевтам же
provideOverlayDouble(Overlay, init?) / injectOverlayDouble(Overlay, injector?) / createOverlayDouble(Overlay, init?)CDK Overlay, чьими ссылками можно управлятьтам же

vitest-auto-spy/angular/diagnostics ​

Только Vitest. Ядро не реэкспортирует и адаптер не регистрирует.

ЭкспортЧто делаетГде подробно
enableAngularDiagnostics(options?) / disableAngularDiagnostics()Превращает пять тихих ошибок в TestBed в падающие тестыДиагностика Angular
assertNoPendingRequests(options?)Падает на HTTP-запросах, на которые никто не ответилЗапросы без ответа
assertNoShadowedProviders(component, fixture)Падает, если собственные провайдеры компонента прячут ваш спайСпрятанные провайдеры
enableTestBedDiagnostics(options?) / disableTestBedDiagnostics()Показывает, сколько времени каждого файла спек ушло на TestBedКуда уходит время спеки
instrumentTestBed(), getTestBedTiming(), formatSpecTiming(timing), reportSpecTiming(timing)Части этого отчёта, для своего репортератам же

vitest-auto-spy/angular-http ​

HttpClient и httpResource() в спеке. Нужен @angular/common. Ядро не реэкспортирует.

ЭкспортЧто делаетГде подробно
provideHttpTesting(options?)HTTP-клиент и тестовый бэкенд одним провайдером, с проверкой при завершенииНастройка HTTP
expectRequest(matcher, options?)Находит единственный подходящий запрос и отвечает на него, дожидаясь обработкиОтвет на запрос
expectNoRequest(matcher?, options?)Проверяет, что подходящего запроса не былоПроверка, что запроса нет
verifyNoPendingRequests(options?)Проверяет, что ни один запрос не остался без ответаВсе запросы отвечены
injectHttpTesting()HttpTestingController для expectOne и похожих вызововКонтроллер HTTP-тестов

vitest-auto-spy/angular-router ​

Подмены роутера. Нужен @angular/router. Ядро не реэкспортирует.

ЭкспортЧто делаетГде подробно
provideActivatedRoute(init?)Настоящий ActivatedRoute, чьи потоки и снимок собраны из одной записиРоутер Angular
injectActivatedRoute(injector?) / createActivatedRoute(init?)Его хэндл: сеттеры двигают потоки и снимок вместетам же
provideRouterDouble(init?)Router на одном URL; navigate и navigateByUrl — спаиПодмена роутера
injectRouterDouble(injector?) / createRouterDouble(init?)Его хэндл: setUrl, emitNavigation, setCurrentNavigationтам же
collectRouterEvents(events)Записывает события роутера парами «класс и URL» для проверки в одну строкуСобытия роутера
provideLocationDouble() / injectLocationDouble(injector?) / createLocationDouble()SpyLocation и MockLocationStrategy из Angular одним вызовомПодмена Location

vitest-auto-spy/signal-forms ​

Сигнальные формы Angular. Нужны @angular/forms и Angular 22. Ядро не реэкспортирует.

ЭкспортЧто делаетГде подробно
createForm(model, schema?, options?)form() из Angular, созданная в контексте внедрения TestBedСигнальные формы
registerFormMatchers()Добавляет toHaveFieldErrors(['required']): весь набор ошибок полятам же

vitest-auto-spy/bun-angular ​

Angular TestBed под bun test. Реэкспортирует /bun (всё ядро) и большую часть /angular: provideAutoSpy, injectSpy, renderShallow, prepareShallow, setInputs, hostElement, queryElement, createWithAutoSpies, stable, flushEffects, settleResource, runEffect, trackRecomputations, trackEffectRuns. Не входят: матчеры, диагностика и хелперы mock*Prop. См. Bun + Angular.

ЭкспортЧто делает
registerDomGlobals(options?)Ставит DOM в рантайм, где его нет; возвращает использованный регистратор
createJsdomRegistrar(options) / createGlobalRegistratorRegistrar(options)Две стратегии DOM, которые он пробует, — для своего preload-файла
copyWindowGlobals(source, target)Копирует свойства window на глобальный объект, не трогая встроенные в рантайм
inlineAngularResources(source, path, options?)Переписывает templateUrl и styleUrl(s) во встроенные template и styles

vitest-auto-spy/nestjs ​

Хелперы для Test.createTestingModule в NestJS. Работает на любом раннере: берёт адаптер, который зарегистрировала точка входа раннера, а на Vitest собирает его из vi. Ядро не реэкспортирует.

ЭкспортЧто делаетГде подробно
provideAutoSpy(Class, methodsOrConfig?)Провайдер { provide, useValue } со спаемNestJS
injectSpy(moduleRef, token)Получает этот спай из тестового модуля с типом Spy<T>там же
createNestUnit(Class, options?)Собирает провайдер по его DI-метаданным, подменяя спаями все зависимостиСборка юнита
trackInjections(tokens, options?)Записывает, какие зависимости код запросил у DIОтслеживание инъекций

vitest-auto-spy/setup ​

Порядок во всём прогоне одним вызовом, плюс таймеры и сеть. setupAutoSpy() ставят в setup-файл.

ЭкспортЧто делаетГде подробно
setupAutoSpy(options?)Одним вызовом включает откат свойств, защиту от утечек и общий strictГигиена прогона
takeStrictViolations()Забирает броски строгого режима, которые тест вызвал намеренноСтрогий режим
setupFakeTimers(config?, options?) / advanceTimers(ms?)Ставит фейковые таймеры с парным откатом; двигает время и доводит микрозадачиФейковые таймеры
withFakeTimers(fn, config?)Выполняет одно тело на фейковых таймерахтам же
mockSystemTime(time) / withSystemTime(time, body) / mockNow(source) / useCountingClock(options?)Управляют тем, что говорит DateЧасы
restoreTimerGlobals() / getWatchedTimerGlobals()Возвращает глобальные таймеры, удалённые фейками / называет отслеживаемыеГигиена прогона
blockNetwork(options?)Закрывает fetch, XHR и sendBeacon и называет, что запросилитам же
stubResponse(init?)Настоящий Response для заглушённого fetch, без приведения типаОтвет для fetch
BLOCKED_FETCH_MESSAGE / BLOCKED_XHR_MESSAGEНеизменное начало сообщения об отклонённом запросе, для сравненияГигиена прогона
trackStrayTimers(host?, options?), countStrayTimers, cancelStrayTimers, describeStrayTimersНаходят и отменяют таймеры, пережившие свой файлтам же
withoutStrayTimerTracking(work, host?)Выполняет подготовку, таймеры которой трекер должен пропуститьтам же
flushUnhandledObservableErrors(host?) / expectUnhandledObservableErrors(expected?, host?)Показывают ошибки Observable, которые никто не обработалтам же
trackStrayRejections, countStrayRejections, flushStrayRejectionsДостают отклонения промисов, которые проглотил zone.jsтам же
trackStrayListeners, baselineStrayListeners, countStrayListeners, describeStrayListeners, removeStrayListenersНаходят и снимают слушатели window и document, оставленные файломтам же
captureGlobalBaseline(host?) / restoreGlobals(host?)Один снимок globalThis; на границе файла возвращает каждую изменённую глобальтам же
guardGlobalPatches(reaction)Называет тест, который сделал глобальное свойство неконфигурируемымтам же
guardPrototypePollution(reaction)Называет и убирает ключ, оставленный на Object.prototypeтам же
guardDocumentPollution(option)Называет и убирает атрибут, оставленный на <html>, <head> или <body>там же
guardStrayConsole(option)Роняет тест, который написал в консоль и не забрал выводтам же
restoreWebStorage(options?) / restoreStorageSpies()Рабочие localStorage / sessionStorage; снимает спаи, которые не снимает mockRestore()там же
installPerTest(install)Заново ставит заглушку перед каждым тестом и возвращает текущий хэндлтам же
trackMockRegistry(), keepMockRegistered(mock), keepRegisteredMocks(), pruneMockRegistry(), getMockRegistrySize(), captureMockRegistry(), resetMockRegistryTracking()Оставляют в реестре моков Vitest только моки, которые живут дольше файлатам же
restoreLongLivedImplementations()Возвращает реализацию, которую снял vi.resetAllMocks() из другого файлатам же
setSpyEngine(engine) / getSpyEngine()Спаи методов из собственного мока библиотеки ('auto-spy', по умолчанию) или из vi.fn() ('runner')Движок спаев
registerFocusMatchers()Добавляет toHaveFocus(), который говорит, почему фокус не тамПроверка фокуса
isAngularUnitTestBuilder()Говорит, идёт ли прогон под билдером unit-test AngularГигиена прогона
describeDuplicateCopies() / getPackageCopies()Реэкспорт из ядраЯдро

vitest-auto-spy/dom-stubs ​

Заглушки браузерных API, которые тестируемый код создаёт сам. Регистрирует адаптер Vitest, только если этого не сделала точка входа раннера. Заглушки снимает restoreMockedProps().

ЭкспортЧто делаетГде подробно
stubIntersectionObserver(options?), stubResizeObserver(options?), stubMutationObserver(options?), stubObserver(name, options?)Подменяют глобальный observer тем, которым управляет спекаЗаглушки observer
intersectionEntry(target, isIntersecting, overrides?), resizeEntry(target, rect?), mutationRecord(target, init?)Собирают одну запись observer без лишних полейтам же
stubMediaElement(options?)<video> или <audio>, который играет и шлёт события медиаМедиаэлемент
stubAnimationFrame(options?)requestAnimationFrame сразу или по flush(timestamp?)Кадры и размеры
stubElementRect(element, rect?)getBoundingClientRect(), отвечающий настоящим DOMRectтам же
stubAbortController()AbortController, чей signal работает со слушателями jsdomПодмены конструкторов
stubWebStorage(key?, options?)localStorage или sessionStorage в памяти, с snapshot()Мок localStorage
stubWorker(options?)Worker, чей скрипт — это спекаЗаглушка Worker
createElementStub(options?)HTMLElement для ElementRef, чьи спаи хранят состояниеЗаглушка элемента
fillMissingDomApis(options?)Один раз дописывает члены DOM, которых нет в jsdom и happy-domтам же

vitest-auto-spy/diagnostics ​

Обычные функции, ничего не регистрируют; работают и из Node-скрипта.

ЭкспортЧто делаетГде подробно
explainSpy(spy, method?)Показывает каждый заданный список аргументов рядом с каждым вызовомexplainSpy
compareTestRuns(baseline, current, root?), summarizeTestRun(report, root?), formatTestRunComparison(comparison)Отвечают, не потеряла ли миграция тестНе потерян ли тест
diffByField(actual, expected)Какое поле в списке записей отличается и в скольких элементахРецепты

vitest-auto-spy/console ​

Тихие типизированные спаи поверх глобального console. См. Спаи консоли.

ЭкспортЧто делает
consoleLogSpy, consoleInfoSpy, consoleWarnSpy, consoleErrorSpy, consoleDebugSpy, consoleTraceSpy, consoleTimeSpy, consoleTimeEndSpyСами спаи; ставятся при импорте
useConsoleSpies()Ставит спаи перед каждым тестом блока и откатывает после
installConsoleSpies() / resetConsoleSpies() / restoreConsole()Поставить, очистить, откатить
consoleOutput()Всё написанное, по каналам
consoleLines()Всё написанное одним списком в порядке вызовов

Другие точки входа ​

ИмпортЭкспортыГде подробно
vitest-auto-spy/jasminecreateSpyObj, пространство имён jasmine, registerJasmineMatchers, enableJasmineCompat, а также createSpyFromClass, createFunctionSpy, provideAutoSpy с .and / .calls; только VitestПереход с Jasmine
vitest-auto-spy/jasmine-compatТолько enableJasmineCompat(), для bun test и node --testНа Bun и node:test
vitest-auto-spy/observer-spysubscribeSpyTo, ObserverSpy, SubscriberSpy: API @hirez_io/observer-spyrxjs
vitest-auto-spy/zoneinstallProxyZonePatch(options?), ставится при импорте: fakeAsync под VitestZone
vitest-auto-spy/eslint-pluginПлагин линтера для flat config (экспорт по умолчанию)Плагин ESLint
vitest-auto-spy/perf-reporterРепортер Vitest, который использует npx vitest-auto-spy perf (экспорт по умолчанию)Командная строка
vitest-auto-spy/package.jsonСам манифест, для инструментов, которые его читают (Storybook, Nx)—

Объекты настройки ​

Второй аргумент createSpyFromClass, createSpyFromInstance и provideAutoSpy — ClassSpyConfiguration. Все опции с примерами: Спаи из класса.

ОпцияТипЧто делает
methodsToSpyOnstring[]Добавляет вызываемые члены к методам, найденным на прототипе
onlyMethodsToSpyOnstring[]Спаит только эти; поиск методов не выполняется
instanceMethodsToSpyOnstring[]Как methodsToSpyOn, для вызываемых членов экземпляра (поля signal(), стрелочные свойства)
observablePropsToSpyOnstring[]Свойства-Observable, которые получают nextWith и остальные
gettersToSpyOn / settersToSpyOnstring[]Аксессоры под спай; читаются через accessorSpies
autoSpyAccessorsbooleanСам находит геттеры и сеттеры
returns{ method: value }Что метод возвращает с самого начала (методу с Observable передайте of(value)); метод остаётся спаем
returnsUndefinedstring[]Методы, которые отвечают undefined; под strict считаются настроенными
returnsClass{ method: Class }Метод отвечает одним спаем этого класса на подмену, доступным как innerDouble(double, 'method'); [Class, options] настраивает его, { build } отвечает тем, что построил пресет — подробнее
overrides{ member: value }Заменяет член обычным значением (см. returns или overrides)
selfReturningstring[]Методы, которые возвращают саму подмену, для цепочек вызовов
fillMissingbooleanДобавляет спай для имени, которого нет на прототипе (abstract-члены)
lazySpiesboolean | 'proxy'Когда собираются спаи методов ('proxy': один прокси-объект собирает их при первом обращении); если не задано, решает число методов
strict, onUnstubbedCall, onUnstubbedReadсм. нижеСтрогий режим
passthroughbooleanТолько createSpyFromInstance: ненастроенные методы вызывают настоящий

createAutoMock, autoMocked и provideAutoSpyForToken последним аргументом принимают AutoMockConfiguration: observablePropsToSpyOn, returns, returnsUndefined, returnsClass, selfReturning, name (как подмену называет отчёт строгого режима) и поля строгого режима. Если засевать нечего, опции можно передать первым аргументом: createAutoMock<EventSource>({ returnsUndefined: ['close'] }). Так работает, когда в объекте есть хотя бы одна из опций returnsUndefined, selfReturning, returnsClass, observablePropsToSpyOn, onUnstubbedCall, onUnstubbedRead; strict, name или returns сами по себе по-прежнему идут вторым аргументом — опции без значений.

StrictSpyConfiguration: принимает каждая фабрика, а setupAutoSpy(options?) — как общее значение для всех тестов. См. приоритет.

ПолеТипЧто делает
strict?booleanВызов ненастроенного метода бросает ошибку с классом, методом и аргументами. По умолчанию выключен
onUnstubbedCall?(call: { className: string | undefined; method: string; args: unknown[] }) => unknownВыполняется вместо этого, и его результат становится результатом вызова. Сильнее strict
onUnstubbedRead?(read: { className: string | undefined; member: string; kind: 'getter' | 'observable'; count: number }) => voidПосле теста получает геттеры и потоки, которые прочитали без настройки. Нужен setupAutoSpy

ValueConfig (для nextWithValues, createObservableWithValues): { value, delay? }, { errorValue, delay? } или { complete?, delay? }.

Опции createSpyClass: { statics?: boolean } копирует статические члены класса на подмену. См. статика.

Опции captureArg: { where? } — предикат, который решает, какие значения принимает ловушка.

Публичные типы ​

Их экспортирует ядро; большинство из них вы увидите разве что в сообщении об ошибке.

ТипЧто этоГде подробно
Spy<T>Объект-спай: каждый метод T с хелперами, которые допускает его тип возврата, и accessorSpiesТипизация спаев
Spy<T, Options>{ overload?: 'first' | 'last' } выбирает перегрузку, по которой работают хелперыПерегрузки
FunctionSpy<Fn>Что возвращает createFunctionSpyОдна функция
DeepMockProxy<T>Что возвращает mockDeepГлубокие подмены
AutoMocked<T>Что возвращает autoMocked: одновременно T и Spy<T>Один объект, два типа
DeepPartial<T>Что принимают createMock и createAutoMock: частичный объект на любой глубинеФикстуры
ClassType<T>Класс T, включая абстрактныеСпаи из класса
SpyDisposableПозволяет использовать любую подмену с usingСброс через using
ObservableLike<T>, SubjectLike<T>, SubjectOf<T>, AutoSpyRxjsTypes<T>Как типы узнают поток, не называя rxjsrxjs в типах
SubscribableLike<T>, CallbackSubscribable<T>, EmissionSource<T>Что принимают проверки ObservableКакие источники подходят
AddSpyMethodsByReturnTypes<Method>Хелперы одного методаТипизация спаев

Все экспортируемые типы по точкам входа. Список нужен для поиска; нужные в работе типы описаны в таблице выше.

text
vitest-auto-spy (их же реэкспортируют /bun, /node, /rstest, /react, /svelte, /vue, /bun-angular)
  AccessorImplementations, AccessorKeysOf, AddAccessorsSpies, AddCalledWithAny,
  AddCalledWithObservable, AddCalledWithPromise, AddCalledWithSpyMethods, AddObservableSpyMethods,
  AddPromiseSpyMethods, AddSpyMethodsByReturnTypes, AddThrowHelper, AddVoidReturnHelpers,
  AdoptMockOptions, AdoptedMock, AnyReturnHelpers, ArgCaptor, AsInstances, AssertMockedOptions,
  AutoMockConfiguration, AutoMocked, AutoSpyDefaultEntry, AutoSpyRxjsTypes, CallLog,
  CallbackSubscribable, CaptureArgOptions, ClassSpyConfiguration, ClassType, CompleteValueConfig,
  ConstructorMock, ConstructorSpy, DeepMockProxy, DeepPartial, EmissionObserver, EmissionOptions,
  EmissionSource, ErrorValueConfig, FixtureFactory, FlushUntilOptions, Func, FunctionSpy,
  InstanceSpyConfiguration, MethodReturns, MockDeepOptions, ModuleNamespace,
  ModuleNamespaceOptions, Mutable, NextValueConfig, NotAPublicKey, ObservableLike,
  ObservablePropSpyMethods, OnlyMethodKeysOf, OnlyObservablePropsOf, OnlyPropsOf,
  OutsideHookReaction, Overload, OverloadChoice, Overloads, PropStubValue, RestoreProp, Spy,
  SpyClassOptions, SpyDisposable, SpyOptions, StrictSpyConfiguration, SubjectLike, SubjectOf,
  SubscribableLike, UnstubbedCall, UnstubbedCallHandler, UnstubbedRead, UnstubbedReadHandler,
  ValueConfig, ValueConfigPerCall, WithMockReturnValue

/rxjs (реэкспорт из ядра)
  AddObservableSpyMethods, CompleteValueConfig, ErrorValueConfig, NextValueConfig,
  ObservablePropSpyMethods, ValueConfig, ValueConfigPerCall

/angular
  AccessorImplementations, AngularTestEnvMode, AngularTestEnvOptions, AngularTokenProvider,
  AngularValueProvider, AutoSpiedInstance, AutoSpyFixture, AutoSpyOverride, AutoSpyTokenDefaults,
  CallbackSubscribable, ComponentInputs, ComponentStubOptions, CreateWithAutoSpiesOptions,
  DirectiveHostOptions, ElementConstructor, EmissionObserver, EmissionOptions, EmissionSource,
  ExtendWithAutoSpiesOptions, InjectionLog, MockResourceOptions, MockedResource,
  NativeElementHolder, PreparedShallow, RenderShallowOptions, ResourceDouble,
  ResourceDoubleSnapshot, ResourceDoubleStatus, ResourceStatusLike, RestoreProp, RunCounter,
  SettleResourceOptions, ShallowOverrides, ShallowRender, SignalPropHandles, SignalPropValues,
  SpiedFixtures, Spy, SpyRegistry, StableOptions, SubjectOf, SubscribableLike,
  TrackInjectionsOptions, TrackedProvider

/angular/diagnostics
  AngularDiagnosticsOptions, PendingRequestsOptions, SpecTiming, TestBedDiagnosticsOptions

/angular/doubles
  AttachedComponent, DialogComponent, DialogDataOf, DialogRefLike, DialogResult,
  MatDialogRefDouble, MatDialogRefInit, OverlayDouble, OverlayDoubleInit, OverlayLike,
  OverlayRefDouble, OverlayRefStub, PlatformFlagTokens, PlatformName, PlatformOverrides,
  PositionCall

/angular/matchers
  RegisterSignalMatchersOptions, ResourceLike, SignalLike, SignalValueOptions

/angular-http
  ExpectRequestOptions, FlushOptions, HttpTestingOptions, RequestErrorOptions, RequestExpectation,
  RequestMatcher, ResponseBody

/angular-router
  ActivatedRouteChange, ActivatedRouteDouble, ActivatedRouteInit, LocationDouble, NavigationInit,
  RouteResources, RouterDouble, RouterDoubleInit, RouterEventPair, RouterEventsHandle

/signal-forms
  CreateFormOptions, FieldErrorMatch

/bun-angular (сверх ядра)
  AngularResourceInlinerOptions, AngularValueProvider, AutoSpiedInstance, ComponentInputs,
  CreateNestUnitOptions, CreateWithAutoSpiesOptions, DomRegistrar, ElementConstructor,
  GlobalRegistratorOptions, JsdomModule, JsdomRegistrarOptions, NativeElementHolder, NestUnit,
  NestUnitClass, NestUnitProvider, NestUnitSpies, PreparedShallow, RegisterDomGlobalsOptions,
  RenderShallowOptions, ResourceStatusLike, RunCounter, SettleResourceOptions, ShallowOverrides,
  ShallowRender, SpyRegistry, StableOptions

/nestjs
  CreateNestUnitOptions, InjectionLog, NestModuleRef, NestUnit, NestUnitClass, NestUnitProvider,
  NestUnitSpies, NestValueProvider, TrackInjectionsOptions, TrackedProvider

/bun (сверх ядра)
  CreateNestUnitOptions, NestUnit, NestUnitClass, NestUnitProvider, NestUnitSpies

/node (сверх ядра)
  CreateNestUnitOptions, NestUnit, NestUnitClass, NestUnitProvider, NestUnitSpies,
  StopTrackingNodeMocks

/vue (сверх ядра)
  VueInjectionToken, VueProvideSpy

/setup
  BlockNetworkOptions, CountingClock, CountingClockOptions, DocumentPollutionOptions,
  DocumentPollutionReaction, DuplicateCopiesReaction, ExpectedUnhandledError, FakeTimersConfig,
  GlobalPatchReaction, MisconfigurationReaction, PerTestHandle, PrototypePollutionReaction,
  RejectionHost, RestoreWebStorageOptions, SchedulerHost, SetupAutoSpyOptions, SetupAutoSpyPreset,
  SpyEngine, StopTrackingListeners, StopTrackingRejections, StopTrackingTimers, StorageSpyKey,
  StrayConsoleOptions, StrayConsoleReaction, StrayListener, StrayListenerReport, StrayRejection,
  StrayTimer, StrayTimerReport, StrayTimersOptions, StubResponseInit, SwallowedStrictCallsReaction,
  SystemTime, TrackedListenerTarget, UnconfiguredReadsReaction, UnhandledObservableError,
  XhrBlockMode

/dom-stubs
  AnimationFrameMode, AnimationFrameStub, AnimationFrameStubOptions, CancelAnimationFrameFn,
  ClassListStub, ElementRectRestore, ElementStub, ElementStubOptions, FillMissingDomApisOptions,
  IntersectionEntryOverrides, IntersectionObserverStubOptions, MediaElementState, MediaElementStub,
  MediaElementStubOptions, MutationRecordInit, ObserverGlobal, ObserverInstance, ObserverStub,
  ObserverStubOptions, RequestAnimationFrameFn, ResizeEntryRect, StyleStub, WebStorageKey,
  WebStorageStub, WebStorageStubOptions, WorkerInstance, WorkerScript, WorkerStub,
  WorkerStubOptions

/diagnostics
  TestRunComparison, TestRunReport, TestRunSummary

/console
  ConsoleChannel, ConsoleLine, ConsoleMethodSpy, ConsoleOutput, ConsoleSpies

/jasmine
  AngularValueProvider, ClassSpyConfiguration, ClassType, JasmineAccessorSpies, JasmineAccessorSpy,
  JasmineAnd, JasmineCallInfo, JasmineCalls, JasmineClassSpyConfiguration, JasmineClock,
  JasmineMethodSpy, JasmineNamespaces, JasmineSpy, JasmineStrategies, JasmineWithArgsAnd,
  JasmineWithArgsStrategies, JasmineWithArgsSync, OnlyMethodKeysOf, OnlyObservablePropsOf,
  OnlyPropsOf, Spy, SpyObj

/jasmine-compat
  JasmineAccessorSpies, JasmineAccessorSpy, JasmineAnd, JasmineCallInfo, JasmineCalls,
  JasmineMethodSpy, JasmineNamespaces, JasmineSpy, JasmineStrategies, JasmineWithArgsAnd,
  JasmineWithArgsStrategies, JasmineWithArgsSync

/observer-spy
  ObserverSpyConfig, ObserverSpyWaitOptions

/zone
  ProxyZonePatchOptions, ProxyZoneScope

/eslint-plugin
  AutoSpyEslintPlugin, FlatConfig, PluginRule, RuleSeverity

Подробнее ​

Детали, у которых пока нет другой страницы.

  • Куда ушли заглушки DOM. Хелперы /dom-stubs и функции /diagnostics ушли из ядра в версии 4.0; см. Переход на 4.0.
  • Настройка createSpyFromInstance. Она принимает ClassSpyConfiguration, но пропускает lazySpies и fillMissing: члены объекта уже существуют, а у экземпляра нет стёртых abstract-членов. Об ошибках настройки она сообщает так же, как фабрика класса, но сверяется с живым объектом, поэтому поле со стрелочной функцией считается членом.
  • Общий strict. setupAutoSpy включает значение по умолчанию, только если вы передали strict или onUnstubbedCall, и снимает его в afterAll. Иначе при isolate: false значение, включённое одним файлом, осталось бы и для файлов, которые его не просили. Значение хранится на globalThis, поэтому доходит до подмены, из какого бы бандла пакета она ни была собрана. Явный strict: false на подмене — единственный способ освободить от общего правила одну широкую зависимость.
  • className в хуках строгого режима — класс, из которого собрана подмена, или name, данное подмене по типу, или createAutoMock(file:line), если имени нет.
  • SpyDisposable — это { [Symbol.dispose](): void }, объявленный структурно, а не как глобальный Disposable. Тот живёт в lib.esnext.disposable, и в проекте, где lib заканчивается на ES2022 и нет @types/node, опубликованные типы не собрались бы. Там, где Disposable есть, Spy<T> ему присваивается. Освобождение любого узла дерева mockDeep сбрасывает всё дерево.
  • SubscribableLike<T> / CallbackSubscribable<T> — две формы подписки, которые принимают проверки Observable: объект-наблюдатель, как в rxjs, и голый колбэк next, как у output() в Angular. EmissionSource<T> — их объединение.
  • AddCalledWithAny<Method> / AnyReturnHelpers. Метод с типом возврата any сохраняет mockReturnValue в цепочке calledWith и получает ещё и хелперы для Promise и Observable, потому что во время выполнения у него есть все они. Эти два типа называют такую цепочку и такой набор — для сигнатуры, собранной вне Spy<T>.
  • DeepPartial<T> по-прежнему отвергает ключ, которого нет в T, на любой глубине. Date, Map, Promise и функции проходят как есть, а настоящее значение принимается везде, где принят частичный объект, поэтому объект хоста вроде NodeList остаётся совместимым.
  • SubjectOf из /angular ничего не расширяет: переменная с этим типом становится Subject из rxjs, только если vitest-auto-spy/rxjs есть в программе TypeScript, а иначе это SubjectLike.
  • restoreGlobals() и глобали DOM. Vitest кладёт свойства окна jsdom или happy-dom на globalThis парами геттер и сеттер, которые переадресуют к окну. global.ResizeObserver = stub вызывает сеттер, а дескриптор свойства не меняется. Поэтому restoreGlobals() возвращает старое значение через тот же сеттер, а не только сравнивает дескрипторы.
  • mockResourceProp после fail(): value() бросает ResourceValueError, как настоящий упавший ресурс.

Опубликовано под лицензией MIT.