Как правильно создать модульный тест для логики внутри функции стрелки

#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 альтернативы:

  1. Методы массивных заглушек напрямую.

Пример, чтобы заглушить массивный метод 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'));
 
  1. Используйте pg в памяти для тестирования.

Только для целей тестирования вы можете использовать такие модули, как: test-pg-pool или pg-mem. Перед тестированием запустите тестовую страницу и после завершения теста уничтожьте ее.

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

1. Большое спасибо! Я уже отключал зависимости в прошлом (например, logger), но мне не приходило в голову делать это в этом сценарии.