我正在尝试使用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测试?
答案 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();
});
});