摩卡异步测试处理错误

时间:2015-07-31 13:14:35

标签: node.js unit-testing testing mocha should.js

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

没关系,我可以为“它”添加一个“完成”回调函数,对于正面情况,这将完全正常。但是当试图测试否定案例时,它只会使测试失败。

我想做这样的事情但异步:

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

相反,我只能测试返回的回调,而不是测试真正发生的事情(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

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

我还尝试了几种组合,例如返回和调用回调,返回成功但是在错误时抛出或调用回调,反过来......

编辑#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');

2 个答案:

答案 0 :(得分:1)

Assuming that someObject.someMethod adheres to the regular Node.js callback convention (error as first argument, value as second), you could use something like this:

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

I inferred from the name of the test case that you want to test for two situations: either the method is "returning" an error, or it's "returning" a value of false (by calling the callback function with the appropriate arguments).

答案 1 :(得分:0)

您可以在匿名函数中完成换行,并手动处理(err,res)并使用硬编码输入调用。 或者:

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