更新2月 - 2013测试错误传递回用回调与摩卡和应
使用与包装的匿名函数的最后一个方式都可以引入一些奇怪的测试行为。如果您希望抛出的错误,但有错误,在实际执行的测试将通过,但会把任何错误,可能不是您所期望的一个。我做了两件事,如果我指定一个错误,我确保从存根返回的错误文本和抛出的错误是相同的。如果是从第三方的图书馆,我不一定知道的错误,我会放一些任意值,让我知道通行证是特定于我测试的单位。使用sinon.js来存储一些shizzle的例子。
it('should return an error if the save fails', function(){
stubCall.restore();
stubCall = sinon.stub(Provider, 'save').callsArgWith(1, new Error('Save Error'));
(function(){
User.create(fakeUser, function(err, user){
if(err)
throw err;
});
}).should.throw("Save Error");
});
我进入的Node.js,并试图做摩卡和should.js一些行为驱动开发(BDD)(和兴农在那里,以及在一些点)。
有一件事我有被用于测试由调用返回的错误,比如这个简单的测试问题:
it('should return an error if you try and execute an invalid Query object', function() {
var stubQuery = {};
Provider.execute(stubQuery, function (err) {
//should.not.exist(err);
should.have.property('message', 'Invalid Query Object');
});
});
与功能:
PostgresqlProvider.prototype.execute = function (query, cb) {
};
不要紧,我尝试和测试,测试始终通过(should.exist等),我可以得到它的第一次失败的唯一途径是通过增加CB(NULL);进入执行功能,这有点违背我在做什么,因为我想添加行为,而不是添加行为测试失败前进行测试。
我知道我在这里做了一些真正的newb错误,可能在几个层面上,但我没有把握错误的测试,因为回调不会被抛出(我相信我可以测试更容易)!
UPDATE
使用从赫尔曼的代码,我调整,确实的话
it('should return an error if you try and execute an invalid Query object', function() {
var stubQuery = {};
Provider.execute(stubQuery, function (err) {
if (err) throw new Error(err);
}).should.throw();
});
现在的问题是我不能“捕获”(测试时没有定义的行为不及格)如果发送回调通过测试的错误,should.throw方法不会被调用,它只是指出,预计一抛发生但没有即使我正在返回一个错误,从我的方法回调。这可能是因为现代的范围 但我不确定我是否应该添加某种形式的封闭,并在什么水平。
更新2
想通了,我需要换一个封闭,而不是回调(DOH!)内调用函数,然后将断言(should.throw)在结束关闭;
it('should return an error if you try and execute an invalid Query object', function() {
var stubQuery = {};
(function(){
Provider.execute(stubQuery, function (err) {
if (err)
throw err;
});
}).should.throw();
});
好的,我试了一下代码。问题在于'should.throw()'检查函数'Provider',而不是回调函数内部抛出异常,这就是测试通过的原因。使用'try..catch'块代替(我的答案更新中有一个例子),当然,你可以想出比我的例子更优雅的东西:) –
(ON UPDATE 2):LOL。我还没弄清楚这个包装器(函数()Provider ......',好的!) –
我也遇到类似的情况。你知道是否有方法来测试错误对象而不会抛出它吗?我一直尝试类似:'''error.should.eql(new Error('my error'))''',但它似乎总是通过(即使错误文本错误)。 – snapfractalpop