testing摩卡抛出的错误

我希望能find这个问题的一些帮助。 我正在为我正在编写的应用程序编写testing。 我已经将问题提炼成以下示例代码。 我想testing一个错误被抛出。 我使用了Testacular作为testing运行者,将mocha作为框架,将chai作为断言库。 testing运行,但testing失败,因为错误被抛出! 任何帮助是极大的赞赏!

function iThrowError() { throw new Error("Error thrown"); } var assert = chai.assert, expect = chai.expect; describe('The app', function() { describe('this feature', function() { it("is a function", function(){ assert.throw(iThrowError(), Error, "Error thrown"); }); }); }); 

你没有通过你的函数assert.throws()正确的方法。

assert.throws()函数需要一个函数作为它的第一个参数。 在你的代码中,当调用assert.throws()时,调用iThrowError并传递它的返回值。

基本上,改变这一点:

 assert.throws(iThrowError(), Error, "Error thrown"); 

对此:

 assert.throws(iThrowError, Error, "Error thrown"); 

应该解决你的问题。

我看到你能够解决你的问题,但无法检查一个具体的错误。 要使用Chai的expect / should语法,可以使用throw()的不同签名中的参数:

 @param{ ErrorConstructor } constructor @param{ String | RegExp } expectederror message @param{ String } message _optional_ 

在你的例子中,你应该能够使用下面的任何一个:

 expect(iThrowError).to.throw(/Error thrown/); expect(iThrowError).to.throw(Error, /Error thrown/); expect(iThrowError).to.throw(new Error('Error thrown')); 

和(再次,从柴的文档),您可以使用以下过滤其他错误消息:

 expect(iThrowError).to.throw(Error).and.not.throw(/Another Error thrown/); 

希望这可以帮助!

添加到顶部的答案 ,如果你需要调用你的函数作为testing的一部分(即你的函数只应该抛出一个错误,如果某些参数通过),你可以包装你的函数调用匿名函数,或在ES6 +你可以在箭头函数expression式中传递你的函数。

 // Function invoked with parameter. // TEST FAILS. DO NOT USE. assert.throws(iThrowError(badParam), Error, "Error thrown"); // WRONG! // Function invoked with parameter; wrapped in anonymous function for test. // TEST PASSES. assert.throws(function () { iThrowError(badParam) }, Error, "Error thrown"); // Function invoked with parameter, passed as predicate of ES6 arrow function. // TEST PASSES. assert.throws(() => iThrowError(badParam), Error, "Error thrown"); 

而且,为了彻底,这是一个更直接的版本:

 // Explicit throw statement as parameter. (This isn't even valid JavaScript.) // TEST SUITE WILL FAIL TO LOAD. DO NOT USE, EVER. assert.throws(throw new Error("Error thrown"), Error, "Error thrown"); // VERY WRONG! // Explicit throw statement wrapped in anonymous function. // TEST PASSES. assert.throws(function () { throw new Error("Error thrown") }, Error, "Error thrown"); // ES6 function. (You still need the brackets around the throw statement.) // TEST PASSES. assert.throws(() => { throw new Error("Error thrown") }, Error, "Error thrown");