如何使用 QUnit 测试 javascript 错误恢复
How to test javascript error recovery with 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 测试?
Doh! 我忽略了 QUnit 测试中的错误。它返回一个即时(错误)响应,它应该返回一个包含错误的承诺。
提示是 QUnit 不知道 promise 的内部结构,事实上从 promise 中冒出错误应该告诉我 QUnit 根本没有处理 promise!
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();
});
});
我正在尝试使用 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 测试?
Doh! 我忽略了 QUnit 测试中的错误。它返回一个即时(错误)响应,它应该返回一个包含错误的承诺。
提示是 QUnit 不知道 promise 的内部结构,事实上从 promise 中冒出错误应该告诉我 QUnit 根本没有处理 promise!
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();
});
});