如何使用QUnit测试javascript错误恢复

时间:2016-01-23 15:50:19

标签: javascript winjs qunit

我正在尝试使用QUnit在依赖服务中对预期的javascript异常进行单元测试。

以下块是测试中的代码。它是使用WinJS承诺的TypeScript。构造函数接受_dataLayer和_errorService作为依赖项。如果_dataLayer抛出特定异常,则测试中的代码会尝试从错误中恢复。

module Services {

  export class MyService {

        constructor(private _dataLayer, private _errorService) {
        }

        private _items: any[];

        getItems() {

            var promise = this._dataLayer.getItems()
                .then((items) => {
                    this._items = items;
                    return this._items;
                })
                .then(null, (error) => {

                    if (error.status === 404) {
                        // tolerate this error and recover
                        this._items = [];
                        return this._items;
                    }

                    // Display an error message
                    this._errorService.handleError(error);

                });

            return promise;

        }
    }
}

以下单元测试试图证明被测代码可以从预期的异常中恢复。

QUnit.test("getItems handles _dataLayer.getItems HTTP 404", function (assert) {

    // arrange
    var done = assert.async();

    var _dataLayer = {
        getItems: function () {
            throw { status: 404 };
        }
    };

    var svc = new Services.MyService(_dataLayer, null);

    // act
    svc.getItems().then(function (items) {

        // assert
        assert.strictEqual(items.length, 0);
        done();

    });

});

正在测试的代码正在从错误中恢复,我无法使用QUnit 来证明。当测试运行时,看起来QUnit只是因为抛出异常而无法完成测试而无法完成测试。

我没有测试是否抛出了错误。测试是为了证明我们成功处理抛出的错误。

有没有办法构建一个QUnit测试,以便测试中的代码能够通过HTTP 404测试?

1 个答案:

答案 0 :(得分:0)

Doh!我忽略了我的QUnit测试中的错误。它返回一个立即(错误)响应,它应该返回一个包装错误的promise。

提示是QUnit不知道承诺的内部,事实上,一个错误从承诺中冒出来应该告诉我QUnit根本没有处理承诺!

QUnit测试的以下修订版正确地证明服务正在从HTTP 404错误中恢复:

QUnit.test("getItems handles _dataLayer.getItems HTTP 404", function (assert) {

    // arrange
    var done = assert.async();

    var _dataLayer = {
        getItems: function () {
            return WinJS.Promise.wrapError({
              status: 404 
            });
        }
    };

    var svc = new Services.MyService(_dataLayer, null);

    // act
    svc.getItems().then(function (items) {

        // assert
        assert.strictEqual(items.length, 0);
        done();

    });

});