为未明确返回值的函数编写Mocha单元测试

问题描述 投票:0回答:1

我有一个关于在函数未明确返回任何内容时在Node应用程序中编写Mocha单元测试的问题。

具体来说,我要编写用于迭代两个数组的测试的函数-一个用于插入,一个用于更新。该函数如下所示:

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循环,所以我不想在return await函数中使用dataSetsMergeOp(),因为尽管这会使测试通过,但它将在第一次迭代后停止循环。

那么为这种功能编写测试的推荐方法是什么?

node.js mocha
1个回答
1
投票

对于单元测试函数,我希望该函数不会抛出任何异常。

您可能想要返回类似{ updatedDocumentsCount: n }的值,并在每次循环迭代时将其递增,并断言它等于您传递的文档数。

对于集成测试,您想在函数执行之前和之后查询数据库,并检查您是否实际更新/插入了预期的文档数。

© www.soinside.com 2019 - 2024. All rights reserved.