【问题标题】:Proper promises error handling at mocha tests在 mocha 测试中正确承诺错误处理
【发布时间】:2016-01-07 03:56:12
【问题描述】:

我正在使用带有 Promise 的 Mongoose,用 bluebird 的方法包装它:

var mongoose = promise.promisifyAll(require('mongoose'))

然后我尝试使用异步方法:

var newUser = new User({email: 'd@a.com', password: '123', userType: 'admin', name: 'paco'});
newUser.saveAsync()
  .then(function (createdUser) {
    console.log(createdUser);
    should.exist(createdUser);
    done();
  })
  .catch(function (err) {
    console.log(err);
    should.not.exist(err);
    done();
  });

但是,由于架构获得了电子邮件字段的唯一索引,如果我尝试多次运行此操作,则会抛出 Unhandled rejection AssertionError: expected Error 导致一切失败。

如何正确处理任何错误?

【问题讨论】:

  • should.not.exist(err); 将在有 err 时抛出 AssertionError,这会导致您的测试失败。
  • @Bergi 我应该如何处理它?我只等待它假设测试失败,而不是打破它
  • 所以.catch(done)在语义上意味着无错误测试?
  • 什么是done,一些测试框架回调? .catch(done) 将导致调用 done 处理程序,并将任何异常作为第一个参数,这通常会导致相应的测试失败。它将防止未处理的拒绝。
  • done 是 mocha 的 it 块回调

标签: javascript mocha.js should.js


【解决方案1】:

首先,如果您尝试在每个测试中插入相同的数据,您将只能运行第一个测试运行,因此您必须在每次测试运行之前清除数据库或删除此特定记录。

beforeEach(function() {
    return Model.findOneAndRemove({email: 'd@a.com'})
});

Mocha 现在支持 Promise,因此不需要 done 回调。您的测试可以重写为:

var newUser = new User({
     email: 'd@a.com', 
     password: '123',
     userType: 'admin', 
     name: 'paco'
});
return newUser.saveAsync().should.eventually.be.fulfilled();
// or return newUser.saveAsync().should.eventually.be.equal(value);

【讨论】:

    猜你喜欢
    • 2020-02-19
    • 2015-12-30
    • 1970-01-01
    • 2018-05-10
    • 2015-10-23
    • 2019-08-21
    • 1970-01-01
    • 2018-06-01
    • 2015-07-29
    相关资源
    最近更新 更多