Написание модульного теста Mocha для функции, которая не возвращает явно значение - PullRequest
0 голосов
/ 21 февраля 2020

У меня есть вопрос о написании модульного теста Mocha в моем приложении Node, когда функция явно ничего не возвращает.

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

module.exports = async function dataSetsMergeOp(args) {
  const recordsToInsert = args.newRecords;
  const recordsToUpdate = args.matchingRecords;

  // Handle inserts
  if (recordsToInsert.length > 0) {
    for (let record of recordsToInsert) {
      try {
        const insertQuery = `
        INSERT INTO cd.customer_accounts (
          hypindx,
          hypnumbr_1,
          hypnumbr_2,
        ) VALUES (?, ?, ?);
        `;
        const args = [
        record.HYPINDX,
        trimmedStringOrNull(record.HYPNUMBR_1),
        trimmedStringOrNull(record.HYPNUMBR_2),
        ];
        console.log('Record inserting...');
        await queryHandler(insertQuery, args);
      } catch (error) {
        console.log(error);
      }
    }
  }

  // Handle updates
  if (recordsToUpdate.length > 0) {
    for (let record of recordsToUpdate) {
      try {
        const updateQuery = `
        UPDATE cd.customer_accounts
        SET
          hypindx = ?,
          hypnumbr_1 = ?,
          hypnumbr_2 = ?
        WHERE hypindx = ?
      `;
      const args = [
        record.ACTINDX,
        trimmedStringOrNull(record.HYPNUMBR_1),
        trimmedStringOrNull(record.HYPNUMBR_2),
        record.HYPINDX
      ];
      console.log('Record updating...');
      await queryHandler(updateQuery, args);
      } catch (error) {
        console.log(error);
      }
    }
  }
};

Теперь соответствующая часть моего теста мокко будет выглядеть примерно так:

  before(async function () {
    try {
      result = await dataSetsMergeOp(args);
    } catch (e) {
      console.log(e.stack);
    }
  });
  it("should be truthy", function () {
    assert.isOk(result);
  });
  it("should return an object for the 'job'", function () {
    assert.isObject(result);
  });
  it("should return a number for the 'affectedRows' property", function () {
    assert.typeOf(result.affectedRows, "number");
  });
  it("should return a number for the 'warningStatus' property", function () {
    assert.typeOf(result.warningStatus, "number");
  });
  it("expect 'warningStatus' to be 0", function () {
    expect(result.warningStatus).to.equal(0);
  });

Но в моем случае здесь, потому что я не явно вернуть в тестируемую функцию что-либо, что в итоге result, даже если функция выполняется успешно, равно undefined. И поскольку моя функция использует for-of l oop, я не хочу использовать return await в моей функции dataSetsMergeOp(), потому что, хотя это сделает тесты успешными, она остановит l oop после Первая итерация.

Итак, каков рекомендуемый способ написания теста для такого рода функции?

1 Ответ

1 голос
/ 21 февраля 2020

К модульному тесту функции, я ожидаю, что функция, например, не выдает никаких исключений.

Возможно, вы захотите возвращать что-то вроде { updatedDocumentsCount: n } и увеличивать его при каждом l oop итерации и утверждают, что она равна количеству пройденных вами документов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...