摩卡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();