【问题标题】:How do I write well-covered test cases using Mocha and Istanbul?如何使用 Mocha 和 Istanbul 编写覆盖良好的测试用例?
【发布时间】:2015-08-04 02:57:50
【问题描述】:

我正在尝试使用 chai 和 Mocha 为 Mongoose 模型函数编写单元测试用例。

模型函数

function getDetails(parameter, fn) {
    Model.findOne({
            parameter: parameter
        })
        .lean()
        .exec(function(err, document) {
            if (err) {
                return fn(err, null);
            }
            return fn(err, document);
        });
};

单元测试用例

describe('→ Database model functions.', function() {
     it('getDetails() - should fetch and return details from database', function(done) {
         model.getDetails(parameter, function(err, document) {
             expect(err).to.be.null;
             expect(document).not.to.be.null;
             expect(document).to.be.an('object');
             done();
         });
     });
 });

使用istanbul 运行代码覆盖率报告后,我的分支覆盖率分数很低,因为以下块没有被覆盖。

if (err) {
    return fn(err, null);
}

据我了解,这对于未处理的异常(例如数据库关闭等)来说有点笼统。此错误也被设计为冒泡,因此应用程序崩溃,然后我可以修复它。我如何编写一个测试用例来解决这个问题?或者更确切地说,我是否应该尝试涵盖这一点?

【问题讨论】:

  • 在另一个测试用例中触发错误并获胜。
  • 如何触发错误?断开数据库或类似的东西?
  • 我认为在单元测试中根本不应该访问数据库。话虽这么说,您应该模拟您的模型以返回错误并期望它。模拟可以使用 Sinon.js 完成。

标签: node.js mongoose mocha.js chai istanbul


【解决方案1】:

您可以使用诸如 Mockgoose 之类的模拟库来测试错误案例 - 特别是,请查看 throwError 选项,该选项会在尝试连接时引发错误 - 请参阅 this section 的文档。这应该是您上述测试的单独测试用例。

正如@limelights 在上面的评论中所说(在我看来是正确的),最好在单元测试中完全避免使用真实的数据库。

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 2015-03-07
    • 2020-09-10
    • 2020-06-29
    • 1970-01-01
    • 2016-04-12
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多