2012-10-25 50 views
4

更新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(); 
    }); 
+0

好的,我试了一下代码。问题在于'should.throw()'检查函数'Provider',而不是回调函数内部抛出异常,这就是测试通过的原因。使用'try..catch'块代替(我的答案更新中有一个例子),当然,你可以想出比我的例子更优雅的东西:) –

+0

(ON UPDATE 2):LOL。我还没弄清楚这个包装器(函数()Provider ......',好的!) –

+0

我也遇到类似的情况。你知道是否有方法来测试错误对象而不会抛出它吗?我一直尝试类似:'''error.should.eql(new Error('my error'))''',但它似乎总是通过(即使错误文本错误)。 – snapfractalpop

回答

0

您需要在测试函数内部生成一个异常,以使测试失败。

我想补充if (err) throw "Invalid query error " + err这样:

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 "Invalid query error " + err 
    }); 
}); 

这应该做的。

(ON UPDATE)

should.throw()没有为我工作,要么......我做了这个肮脏的黑客工作流程:

it('should return an error if you try and execute an invalid Query object', function() { 
    var stubQuery = {}; 

    try { 
    Provider.execute(stubQuery, function (err) { 
     if (err) throw "Invalid query error " + err 
    }); 
    // No error, keep on the flow 
    noError(); 
    } catch (e) { 
    // Error, let's continue the flow there 
    error (e) 
    } 

    function noError() { 
    // The flow in the event we have no error 
    // ... // 
    } 

    function error (errorObj) { 
    // The flow, in the event we have error 
    // ... // 
    } 

}); 

希望这有助于!

+0

嗨赫尔曼,谢谢你,这工作(测试失败),但我无法得到should.throw工作现在通过它?我已更新与进展的问题。 – Modika

+0

去标记这是答案,因为它得到原始的观点并回答它,已经更新了问题以包括现在是wo的代码为我而生。 – Modika