测试Mocha中引发的错误

Chr*_*zer 73 javascript testing mocha.js chai

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

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");
        });
    });
});
Run Code Online (Sandbox Code Playgroud)

red*_*red 111

你没有以assert.throws()正确的方式传递你的功能.

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

基本上,改变这个:

assert.throws(iThrowError(), Error, "Error thrown");
Run Code Online (Sandbox Code Playgroud)

对此:

assert.throws(iThrowError, Error, "Error thrown");
Run Code Online (Sandbox Code Playgroud)

应该解决你的问题.

  • Glen,将参数传递给你的函数,尝试包装函数:assert.throw(function(){iThrowError(args)},Error) (61认同)
  • 如果我想将参数传递给函数怎么办?有没有办法做到这一点? (29认同)

Jak*_*ake 30

添加到最佳答案,如果您需要在测试中调用您的函数(即,如果传递了某些参数,您的函数应该只抛出错误),您可以将函数调用包装在匿名函数中,或者在ES6 +中,你可以在箭头函数表达式中传递你的函数.

// 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");
Run Code Online (Sandbox Code Playgroud)

而且,仅仅为了彻底,这里有一个更文字的版本:

// 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");
Run Code Online (Sandbox Code Playgroud)

  • @Louis这不是重复.接受的答案是将函数作为引用传递,并且**不**调用函数.正如我在答案的顶部说明的那样,如果测试需要调用,我将解释如何实际调用函数作为测试的一部分. (6认同)
  • 重复接受的答案有什么意义? (2认同)

Vin*_*ard 20

我看到您能够解决您的问题,但无法检查特定错误.要使用Chai的expect/should语法,可以使用throw()的不同签名中的参数:

@param{ ErrorConstructor } constructor
@param{ String | RegExp } expectederror message
@param{ String } message _optional_
Run Code Online (Sandbox Code Playgroud)

在您的示例中,您应该能够使用以下任一方法:

expect(iThrowError).to.throw(/Error thrown/);
expect(iThrowError).to.throw(Error, /Error thrown/);
expect(iThrowError).to.throw(new Error('Error thrown'));
Run Code Online (Sandbox Code Playgroud)

而且(再次,从chai的文档中),您可以使用以下方法过滤其他错误消息:

expect(iThrowError).to.throw(Error).and.not.throw(/Another Error thrown/);
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!