如果http错误,QUnit / Sinon测试异步ajax调用抛出异常

时间:2018-04-04 11:27:05

标签: javascript unit-testing exception qunit

我有一段带有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文档,看起来我正在做正确的事情。我想这与异步调用有关,但我无法解决它。

1 个答案:

答案 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,但这可能现在可以使用。