Как правильно экспортировать класс для расширения из других классов NodeJS?

#node.js #unit-testing #mocha.js #chai #sinon

#node.js #модульное тестирование #mocha.js #чай #sinon

Вопрос:

Базовый класс выглядит следующим образом:

 class BaseReport {
    constructor(reportName) {
        this.reportName = reportName;
    }
    async generateReport(accountId, request) {
        let results = await this.getDataFromDb(request);
        results = this.formatResults(results);
        return updatedResults;
    }

    formatResults(data) {
        //Some logig here
        return  result
    }

    getDataFromDb(request) {
        //Logic to get data from database
        return errorRequest;
    }

}

module.exports = BaseReport;
 

У меня есть другой класс, который расширяет базовый класс:

 const BaseReport = require("./base.service");

class DataReport extends BaseReport {
    constructor() {
        super('dataReport');
    }

    formatResults(data) {
        //Logic to format results in a different way
        return data;
    }
}

module.exports = new DataReport();
 

Пока все работает хорошо. DataReport классу не нужно реализовывать метод getDataFromDB , потому что он наследуется от BaseReport class .

Проблема начинается, когда я пишу модульные / интеграционные тесты.

Когда я пытаюсь заглушить функцию getData(), она не работает (она не заглушается, а вместо этого вызывает метод и выполняет вызов базы данных. Я понимаю, ПОЧЕМУ это происходит… В BaseReport классе я экспортирую сам класс. Поэтому, когда я создаю объект в своих модульных тестах и пытаюсь заглушить функцию, это не тот метод и объект, которые инициализируются при запуске приложения. Каждый раз, когда вы используете ключевое слово «new», создается новый объект и имеет свои собственные методы. Если я хочу отключить метод из класса DataReport, он работает нормально, потому что там я экспортирую объект этого класса ( module.exports = new DataReport(); ) . В этом случае может существовать только одна копия объекта и, следовательно, только одна копия методов.

Теперь я не могу сделать то же самое для BaseReport class, потому что, насколько я понимаю, вы НЕ МОЖЕТЕ расширить BaseReport class, если я экспортировал новый object ( module.exports = new BaseReport(); ) .

Каков правильный способ реализовать это, чтобы также работали модульные тесты??

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

1. Можете ли вы опубликовать свой неудачный тест? Потому что Синон может заглушки класса метод ( sinon.stub(Class.prototype, "method") ) и объектный метод ( sinon.stub(object, "method") ).

2. Что именно вы тестируете? Пожалуйста, предоставьте тестовый код