摩卡asynchronoustesting处理错误

我试图用摩卡创build一个testing用例,但是我的代码是asynchronous的。

这很好,我可以添加一个“完成”callback函数“它”,这将正常情况下完美的罚款。 但是当试图testing负面情况时,只会使testing失败。

我想做这样的事情,但asynchronous:

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

相反,我只能testing一个callback返回,而不是testing真正发生了什么(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" 

我也尝试使用期望和断言,但同样的规则适用。

任何线索? 谢谢

编辑#1:

我没有成功尝试:

使用true / false

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

使用callback:

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

使用callback2:

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

使用callback3:

 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); 

我也尝试了几个组合,如返回和调用callback,成功返回,但抛出或调用错误的callback,相反..

编辑#2:

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

编辑#3:

在testing方面总结:

 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'); 

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

 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(); }); }); 

我从testing用例的名称推断出你想testing两种情况:方法是“返回”一个错误,或者是“返回”一个false值(通过用适当的参数调用callback函数)。

你可以在匿名函数中完成,并手动处理(err,res) ,并用硬编码input完成调用。 要么:

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