#javascript #unit-testing #sinon #stub
Вопрос:
Я работаю над существующим веб-сервисом NodeJS, используя HapiJS, лабораторию Hapi для тестирования вместе с Sinon. Служба подключается к базе данных Postgres с помощью massiveJs. Есть метод, реализованный кем-то другим, в котором нет модульных тестов. Теперь я повторно использую этот метод и хочу реализовать для него несколько модульных тестов. Этот метод выполняет внутри него транзакцию massivejs, сохраняющуюся в нескольких таблицах.
async createSomething(payload) {
const { code, member } = payload;
const foundCompany = await this.rawDb.ethnics.tenants.findOne({ code });
if (foundCompany amp;amp; foundCompany.companyId) {
const { companyId } = foundCompany;
const { foreignId } = member;
return await this.rawDb.withTransaction(async (tx) => {
const foundMember = await tx.ethnics.members.findOne({ foreign_id: foreignId, company_id: companyId });
if (!foundMember) {
//some business logic...
const newMember = await tx.ethnics.members.insert(member);
//more business logic persisting to other tables...
return newMember;
}
});
}
}
Проблема в том, что я не знаю, как заглушить материал только внутри функции стрелки, не заглушая всю функцию стрелки. Я просто хочу заглушить звонки из Техаса. Я также не хочу использовать базу данных, но заглушаю свойство rawDb. Выполнимо ли это с точки зрения модульного тестирования?
Ответ №1:
Да, это выполнимо. Есть 2 альтернативы:
- Методы массивных заглушек напрямую.
Пример, чтобы заглушить массивный метод findOne:
const massive = require('massive');
const sinon = require('sinon');
// Stub massive.Readable class method findOne.
// You need to find where is the real method findOne and stub it.
const stub = sinon.stub(massive.Readable, 'findOne');
// You can resolve it.
stub.resolves();
// Or you can throw it.
stub.throws(new Error('xxx'));
- Используйте pg в памяти для тестирования.
Только для целей тестирования вы можете использовать такие модули, как: test-pg-pool или pg-mem. Перед тестированием запустите тестовую страницу и после завершения теста уничтожьте ее.
Комментарии:
1. Большое спасибо! Я уже отключал зависимости в прошлом (например, logger), но мне не приходило в голову делать это в этом сценарии.