我有一段带有jQuery ajax调用的代码,如果出现http错误则抛出异常。
function Locale)() {
$.ajax({
url: this.endpoint,
success: function(data) {
//do stuff
},
error: function(jqxhr, error, serverException) {
throw new httpErrorException(jqxhr, error, serverException);
}
});
}
我的例外很简单,确保其正常工作
httpErrorException = function(jqxhr, error, serverException) {
this.toString = function() {
return error + ': ' + jqxhr.status + ' ' + serverException
}
}
我的测试如下
QUnit.test('test httpErrorException', function(assert) {
assert.expect(1);
server.respondWith('GET', '/fake/locale', [500, '', 'Internal Server Error']);
var done = assert.async();
assert.throws(
function() {
loc = locale(fakeUrl);
},
function(err) {
return err.toString() === 'error: 500 Internal Server Error';
},
'it failed'
);
done();
});
当我运行测试时,我得到了
Uncaught it failed
Expected: function( a ){
[code]
}
Actual: undefined
我一直在https://api.qunitjs.com/assert/throws查看Qunit.throws文档,看起来我正在做正确的事情。我想这与异步调用有关,但我无法解决它。
答案 0 :(得分:1)
您的throw
位于回调函数内部,因此它会从locale()
函数中而不是从那里抛出。您不能直接使用异步调用中的throw / catch。您可以查看使用Promises,或在error
回调中添加其他函数调用。做任何你需要做的事情,然后在你的测试中模拟那个功能。
(请注意,这是示例代码,我还没有运行它...)
在你的SOURCE代码中:
function Locale() {
$.ajax({
url: this.endpoint,
success: function(data) {
//do stuff
},
error: function(jqxhr, error, serverException) {
handleErrors(jqxhr, error, serverException);
}
});
}
function handleErrors(jqxhr,err,ex){/ * ......做任何事...... * /}
然后在您的TEST代码中:
QUnit.test('test http errors', function(assert) {
assert.expect(1);
server.respondWith('GET', '/fake/locale', [500, '', 'Internal Server Error']);
var done = assert.async();
// really you should using something like Sinon to stub functions...
function handleErrors(jqxhr, err, ex) {
assert.strictEqual(jqxhr.status, 500);
done();
}
Locale(fakeUrl);
});
请注意,这不是理想的设置...如果ajax调用成功(当 失败时),您的测试将会暂停。实际上,你可能应该使用Promises,但这可能现在可以使用。