Как издеваться над экземпляром класса, созданным конструктором, с помощью шутки?

Учитывая класс Person, который создает и использует другой класс Logger, как можно проверить вызов метода Logger при создании экземпляра Person в приведенном ниже примере?

// Logger.ts
export default class Logger {
    constructor() {}
    log(m: String) {
        console.log(m);

        // Other operations that are outside testing (e.g., file write).
        throw Error('error');
    }
}

// Person.ts
import Logger from "./Logger";
export default class Person {
    constructor() {
        const logger = new Logger();
        logger.log('created');
    }
    // ...
}

// Person.test.ts
import Person from "./Person";
import Logger from "./Logger";
describe('Person', () => {
    it('calls Logger.log() on instantiation', () => {
        const mockLogger = new Logger();
        getCommitLinesMock = jest
            .spyOn(mockLogger, 'log')
            .mockImplementation(() => {});

        new Person(); // Should call Logger.log() on instantiation.

        expect(getCommitLinesMock).toBeCalled();
    });
});

Один из вариантов — передать Logger в качестве аргумента конструктора, как показано ниже:

class Person {
    constructor(logger: Logger) {
        logger.log('created');
    }
    // ...
}

Однако есть ли другой способ завершить тест без изменения конструктора?

Определены ли классы в отдельных файлах или в одном и том же файле?

SSM 17.05.2022 20:14

Классы в отдельных файлах, я обновлю вопрос

surajs02 17.05.2022 20:17
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
17
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы можете издеваться над классом Logger, используя шутка.

import Person from "./path/to/person";
import Logger from "./path/to/logger";

jest.mock("./path/to/logger");

describe("Person", () => {
  it("calls Logger.log() on instantiation", () => {
    new Person();
    expect(Logger).toHaveBeenCalled();
  });
});

Удивительно, я не знал, что вы можете издеваться над целым классом и его методами по файлам с помощью jest.mock. Я приму этот ответ, поскольку он работает и отвечает на вопрос без изменения конструктора :)

surajs02 17.05.2022 20:37

Можно ли также использовать jest.mock для проверки определенных методов, например, если конструктор Person вызывает logger.method1 и logger.method2, как можно применить toHaveBeenCalled к этим методам издевательства Logger из теста?

surajs02 17.05.2022 20:44

Да, вы можете сделать это с помощью jest.mock, но вам придется предоставить фиктивную реализацию для класса Logger.

SSM 17.05.2022 20:49

Так что-то вроде Logger.method1.mockImplementation? Но это использует статический класс, где method1 недоступен, я не уверен, как получить доступ к методу экземпляра, например logger.method1.mockImplementation

surajs02 17.05.2022 20:52

Нет, не так, потому что метод находится не в самом классе, а в экземпляре класса.

SSM 17.05.2022 20:55

Хороший вопрос, я открою новый вопрос :)

surajs02 17.05.2022 20:58

Новый вопрос о методах экземпляра здесь stackoverflow.com/questions/72279428/…

surajs02 17.05.2022 21:11

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