更新2013年7月2日
使用包含匿名函数的最后一种方法可能会引入一些奇怪的测试行为。如果您期望抛出错误,但实际执行中存在错误,则测试将通过,但会传递任何错误,可能不会传递您期望的错误。我做两件事,如果它是一个错误我指定我确保从存根返回的错误文本和抛出的错误是相同的。如果它来自第三方库,我不一定知道错误,我将放置一些任意值,以便我知道通行证是特定于我正在测试的单位。使用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并尝试使用Mocha和should.js进行一些行为驱动开发(BDD)(并且在某些时候也在那里使用sinon)。
我遇到问题的一件事是测试回调返回的错误,例如这个简单的测试:
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);进入执行函数,这与我正在做的事情相反,因为我在添加行为之前尝试测试,而不是添加行为以使测试失败。
我知道我在这里做了一些真正的新错误,可能在几个级别,但我没有抓住测试错误传递作为回调没有被抛出(我相信我可以测试更容易)!
更新
使用Herman的代码,我进行了调整,确实是单词(测试失败,未定义任何行为)
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 :(得分: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
// ... //
}
});
希望这有帮助!