Mocha 异步测试处理错误

Mocha async test handle errors

我正在尝试使用 Mocha 创建测试用例,但我的代码是异步的。

没关系,我可以向 "it" 添加一个 "done" 回调函数,这对于肯定的情况非常有效。但是当尝试测试负面案例时,它只会使测试失败。

我想做这样的东西但是异步的:

someObject.someMethod(null).should.equal(false)

相反,我只能测试 return 的回调,而不是测试真正发生的事情(null 无效):

it('this should return false or an error', function(done) {
    someObject.someMethod(null, '', done);
});

我想这样写:

it('this should return false or an error', function(done) {
    someObject.someMethod(null, '', done).should.throw();
});

但这会导致这个错误:

"TypeError: Cannot read property 'should' of undefined"

我也尝试过使用 expect 和 assert,但适用相同的规则。

有什么线索吗? 谢谢

编辑#1:

我尝试失败了:

使用true/false

return (true); // ok
retur (false); // error

使用回调:

callback(); // ok
callback(err); // error

使用回调2:

callback(true); // ok
callback(false); // error

使用回调 3:

callback(null); // ok
callback(new Error()); // error

使用 throw(也在 try/catch 块内):

// a
 throw new Error();
callback();  

// b
 throw new Error();
callback(new Error());  

// c
 throw new Error();
callback(false);  

我也尝试了几种组合,例如 returning 和调用回调,returning 成功但抛出或调用回调错误,相反..

编辑#2:

it('should throw', function(done) {
  (function(done) {
    someObject.someMethod(null, '', done)
  }).should.throw();
});`

编辑#3:

测试端总结:

it('this should return false or an error', function(done) {
    someObject.someMethod(null, function(err, value) {
        expect(value === false || err instanceof Error).toEqual(true);
       return done();
    });
}); 

在代码端:function(var, callback)

...
callback(new Error('your comments'), false);
// or
callback(new Error('your comments'));
...
// if successful:
callback();
// or
callback(null);
// or
callback(null, 'foo');

您可以将 done 包装在匿名函数中,然后手动处理 (err,res) 并使用硬编码输入调用 done。 或者:

(function(){
  throw new Error('fail');
}).should.throw();

假设 someObject.someMethod 遵守常规 Node.js 回调约定(错误作为第一个参数,值作为第二个参数),您可以使用这样的东西:

it('this should return false or an error', function(done) {
  someObject.someMethod(null, '', function(err, value) {
    (err instanceof Error || value === false).should.equal(true);
    return done();
  });
});

我从测试用例的名称推断出您要测试两种情况:方法是 "returning" 错误,或者是 "returning" false 的值(通过使用适当的参数调用回调函数)。