Модульное тестирование базы данных запросов - PullRequest
0 голосов
/ 30 ноября 2018

Проблема: Итак, проблема, с которой я столкнулся в последнее время как начинающий юнит-тест, касается классов, которые интенсивно используют базу данных.

Используемые технологии: Typescript, SinonJS, Node-Postgres и Jest

Пример: Для данной функции

public async insertUserDetails() {

  const confirmationCode = this.generateConfirmationCode();

  try {

    await this.db.query({
      text: 'INSERT INTO users (firstname, lastname, email, password, registration_date, confirmation_code) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *',
      values: [this.firstname, this.lastname, this.email, this.password, this.registrationDate, confirmationCode]
    });


  } catch (error) {

    throw error;

  }

}

Вопрос: Был бы подходящий модульный тест, чтобы убедиться, что функция db.query () вызывается с правильным sql, например, следующим?Или это будет считаться пустой тратой времени и тестом хрупким ?

test("should format correct sql", async () => {

    //Test Setup
    const user = new User({
        firstname: "John",
        lastname: "doe",
        email: "email@example.com",
        password: "some_password_hash",
        registrationDate: "some_random_date",
    });

    //Mocks
    const queryStub = sinon.stub(user.db, "query");
    const confirmationCode = sinon.stub(user,'generateConfirmationCode').returns("48fsakb8a-cfjdab");

    const sampleQuery = {
        text: 'INSERT INTO users (firstname, lastname, email, password, registration_date, confirmation_code) VALUES ($1, $2, $3, $4, $5, $6) RETURNING *',
        values: [user.firstname, user.lastname, user.email, user.password, user.registrationDate, confirmationCode]
    }

    //Preform
    await user.insertUserDetails();

    //Assert
    sinon.assert.calledWith(queryStub, sampleQuery);


});

Или я должен все вместе пропустить модульные тесты для этих типов функций и классов и настроить базу данных интеграционных тестов и протестировать эти случаи с помощью интеграционных тестов?

Это очень упрощенный пример, поскольку я не занимался тестированием транзакций базы данных, но тестирование транзакций становится еще более опасным, так как выполняется несколько запросов.

Спасибо за любую помощь!Это сводит меня с ума -__-

1 Ответ

0 голосов
/ 01 декабря 2018

Подойдет ли модульный тест, чтобы убедиться, что функция db.query () вызывается с правильным sql, например, следующим?

Что вы пытаетесь сделать, этоне модульный тест, если вы сосредоточены на создании db.query.Тогда это становится интеграционным тестом.Здесь ваша единица, которую вы хотите протестировать, insertUserDetails.Итак, вы сосредоточены на поведении этой функции.Что вы можете проверить: 1. то, что db.query вызывается с правильными параметрами (надеясь, что this.db может быть имитирован) 2. Если db.query выдает исключение, то ваш блок catch выполняется, и ваше исключение выдается.

Точно так же вы должны попытаться написать модульный тест для this.db класса, охватывающего функцию query.

Итак, как только вы убедились, что оба подразделения правильно покрыты, тогда это будет хорошим началом.

Теперь, если у вас есть возможность написать интеграционный тест в одном кадре, где вы можете использоватькакая-то база данных в памяти или может быть реальной базой данных в вашем распоряжении, а затем идти вперед и делать это, и вы не можете написать модульные тесты в целом.

Надеюсь, это поможет.

...