Макет интерфейса WebAPI с использованием ts-mockito

Я пишу модульный тест для класса, который использует интерфейс WebAPI браузера.
Я использую ts-mockito для имитации интерфейса (в моем случае это WebGL2RenderingContext).

Когда я запускаю тест, Node выдает ReferenceError: WebGL2RenderingContext is not defined что понятно, потому что тест выполняется в среде NodeJS, а не в браузере, поэтому класс/интерфейс не существует.

Есть ли способ сделать среду NodeJS осведомленной об интерфейсах WebAPI, чтобы ее можно было издеваться?

ПРИМЕЧАНИЕ. Поскольку это модульный тест, его НЕ следует запускать в реальном браузере.
jsdom кажется возможным решением, но я понятия не имею, как издеваться над ним с помощью ts-mockito.


Следующий фрагмент иллюстрирует то, что я пытаюсь сделать:

import { mock, instance, verify } from 'ts-mockito'

// ========== CLASS ==========
class DummyClass {
    dummyMethod() : void {}
}

class TestedClass {
    static testDummy(dummy : DummyClass) : void {
        dummy.dummyMethod();
    }

    static testGlCtx(glCtx : WebGL2RenderingContext) : void {
        glCtx.flush();
    }
}

// ========== TEST ==========
describe('DummyClass', () => {
    // This test passed successfully
    it('works fine', () => {
        const mockDummy = mock(DummyClass);

        TestedClass.testDummy( instance(mockDummy) );

        verify( mockDummy.dummyMethod() ).once();
    });
});

describe('WebGL interface', () => {
    it('works fine', () => {
        // This line failed with 'ReferenceError: WebGL2RenderingContext is not defined'
        const mockGLCtx = mock(WebGL2RenderingContext);

        TestedClass.testGlCtx( instance(mockGLCtx) );

        verify( mockGLCtx.flush() ).once();
    });
});

Запустите с помощью мокко с помощью команды mocha --require ts-node/register 'test.ts'.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
557
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Есть два решения: для обычных DOM API и для универсального имитации.

Для общих API DOM

Как подробно описано в этом ответе StackOverflow, jsdom можно использовать для переноса API-интерфейсов DOM в среду выполнения NodeJS.

Беги npm install --save-dev jsdom global-jsdom
и измените команду Mocha на

mocha --require ts-node/register --require global-jsdom/register 'test.ts'

ПРИМЕЧАНИЕ: global-jsdom — это более новая и обновленная версия jsdom-global.

Это решение работает для распространенных API-интерфейсов DOM (таких как HTMLElement, SVGElement, File),
но это не работает для более специализированных API (WebGL, Crypto, аудио и видео).

Для насмешки общего интерфейса

Оказывается, у ts-mockito есть способ имитировать интерфейсы, включая DOM и любые веб-API браузера.

Таким образом, приведенный выше тестовый код можно изменить на:

describe('WebGL interface', () => {
    it('works fine', () => {
        const mockGLCtx = mock<WebGL2RenderingContext>();

        TestedClass.testGlCtx( instance(mockGLCtx) );

        verify( mockGLCtx.flush() ).once();
    });
});

и тест пройдет успешно.

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

Как имитировать переменные конструктора в файле тестовых примеров js?
Почему Puppeeter заставляет мой набор тестов зависать на 30 секунд, когда я использую «waitForSelector», даже если я вызываю «закрыть» на странице и в браузере?
«Вам может понадобиться дополнительный загрузчик для обработки результатов этих загрузчиков». ошибка (React, Typescript)
Jsonwebtoken 9.0.0 — ошибка получения: TypeError: невозможно переопределить свойство: декодировать — при попытке заглушки
Тестирование с помощью NPM three mocha+typescript
Как утверждать из нескольких возможностей в Cypress? Один вариант может быть верным из нескольких
Как остановить кипарис от закрытия браузера после каждого тестового примера (его)?
Как я могу программно и условно пропустить/провалить/выбрать один или группу тестов Cypress (и Mocha)?
Есть ли способ проверить, существует ли псевдоним в тесте кипариса
Запуск и отладка в коде vs (windows) — опция Mocha grep через launch.json выдает ошибку: тестовые файлы не найдены (или выполняются все тесты, а не шаблон)