#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. Что именно вы тестируете? Пожалуйста, предоставьте тестовый код