Chai 期望 [Function] 抛出一个(错误)未通过测试(使用 Node)
Chai expected [Function] to throw an (error) not passing the test (Using Node)
问题:
我正在使用 Chai 进行测试,我似乎一直在测试预期的错误:
Chai 期望 [Function] 抛出一个(错误)
当前代码:
测试代码如下:
describe('Do something', function () {
it('should remove a record from the table', function (done) {
storage.delete(ID, done);
});
it('should throw an error when the lookup fails', function () {
expect(storage.delete.bind(storage, ID)).to.throw('Record not found');
});
});
函数代码如下:
delete: function (id, callback) {
// Generate a Visitor object
visitor = new Visitor(id);
/* Delete the visitor that matches the queue an
cookie provided. */
tableService.deleteEntity(function (error, response) {
// If successful, go on.
if (!error) {
// Do something on success.
}
// If unsuccessful, log error.
else {
if (error.code === 'ResourceNotFound') {
throw new Error('Record not found');
}
// For unexpected errros.
else {
throw new Error('Table service error (delete): ' + error);
}
}
if (callback) callback();
});
},
尝试的解决方案:
我尝试了多种调用 expect 函数的变体(包括调用匿名函数:
expect(function() {storage.delete(ID);}).to.throw('Record not found');
绑定,如示例中提供的那样,
和
的基本之一
expect(storage.delete(ID)).to.throw('Record not found');
我还尝试将 'Record not found' 中的 throw 参数替换为多项内容,包括将输入定向到已创建的错误 (Error),以及在参数中创建一个新错误 (new Error('Record not found'));
可能原因:
我怀疑没有抛出错误,因为测试需要一段时间才能与数据库通信以删除记录,但是我不确定如何补救。
此外,似乎在此测试之后立即运行的测试实际上 returns 本应在此测试中返回的错误。
鉴于(来自评论)tableService.deleteEntity
是异步的,无法测试 throw
。并且代码本身是无效的。因为抛出的异常不会被捕获,所以它不会被处理,因为它是在不同的 tick 中抛出的。详细了解 Asynchronous error handling in JavaScript and unhandled exceptions in Node.js
换句话说,无法测试这样的函数是否会抛出错误:
function behaveBad(){
setTimeout(function(){
throw new Error('Bad. Don\'t do this');
}, 50);
}
问题:
我正在使用 Chai 进行测试,我似乎一直在测试预期的错误:
Chai 期望 [Function] 抛出一个(错误)
当前代码:
测试代码如下:
describe('Do something', function () {
it('should remove a record from the table', function (done) {
storage.delete(ID, done);
});
it('should throw an error when the lookup fails', function () {
expect(storage.delete.bind(storage, ID)).to.throw('Record not found');
});
});
函数代码如下:
delete: function (id, callback) {
// Generate a Visitor object
visitor = new Visitor(id);
/* Delete the visitor that matches the queue an
cookie provided. */
tableService.deleteEntity(function (error, response) {
// If successful, go on.
if (!error) {
// Do something on success.
}
// If unsuccessful, log error.
else {
if (error.code === 'ResourceNotFound') {
throw new Error('Record not found');
}
// For unexpected errros.
else {
throw new Error('Table service error (delete): ' + error);
}
}
if (callback) callback();
});
},
尝试的解决方案:
我尝试了多种调用 expect 函数的变体(包括调用匿名函数:
expect(function() {storage.delete(ID);}).to.throw('Record not found');
绑定,如示例中提供的那样,
和
的基本之一expect(storage.delete(ID)).to.throw('Record not found');
我还尝试将 'Record not found' 中的 throw 参数替换为多项内容,包括将输入定向到已创建的错误 (Error),以及在参数中创建一个新错误 (new Error('Record not found'));
可能原因:
我怀疑没有抛出错误,因为测试需要一段时间才能与数据库通信以删除记录,但是我不确定如何补救。
此外,似乎在此测试之后立即运行的测试实际上 returns 本应在此测试中返回的错误。
鉴于(来自评论)tableService.deleteEntity
是异步的,无法测试 throw
。并且代码本身是无效的。因为抛出的异常不会被捕获,所以它不会被处理,因为它是在不同的 tick 中抛出的。详细了解 Asynchronous error handling in JavaScript and unhandled exceptions in Node.js
换句话说,无法测试这样的函数是否会抛出错误:
function behaveBad(){
setTimeout(function(){
throw new Error('Bad. Don\'t do this');
}, 50);
}