Javascript 测试Mocha中抛出的错误

Javascript 测试Mocha中抛出的错误,javascript,testing,mocha.js,chai,Javascript,Testing,Mocha.js,Chai,我希望能在这个问题上找到一些帮助。我正在尝试为我正在编写的应用程序编写测试。我已将问题提炼为以下示例代码。我想测试是否抛出了错误。我使用TestCular作为测试运行程序,mocha作为框架,chai作为断言库。测试运行,但测试失败,因为抛出了错误!非常感谢您的帮助 function iThrowError() { throw new Error("Error thrown"); } var assert = chai.assert, expect = chai.expect;

我希望能在这个问题上找到一些帮助。我正在尝试为我正在编写的应用程序编写测试。我已将问题提炼为以下示例代码。我想测试是否抛出了错误。我使用TestCular作为测试运行程序,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");
        });
    });
});

我看到您能够解决问题,但无法检查特定错误。要使用Chai的expect/should语法执行此操作,可以使用以下不同签名的参数:

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

expect(iThrowError).to.throw(/Error thrown/);
expect(iThrowError).to.throw(Error, /Error thrown/);
expect(iThrowError).to.throw(new Error('Error thrown'));
并且(同样,从chai的文档中),您可以使用以下方法过滤其他错误消息:

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

希望这有帮助

您没有以正确的方式将函数传递给
assert.throws()

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

基本上,改变这一点:

assert.throws(iThrowError(), Error, "Error thrown");
为此:

assert.throws(iThrowError, Error, "Error thrown");
应该能解决你的问题

使用args:

assert.throw(() => { iThrowError(args) }, Error);

此外,如果您需要在测试过程中调用函数(即,只有在传递某些参数时,您的函数才应该抛出错误),您可以将函数调用包装在匿名函数中,或者在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");
为了彻底起见,这里有一个更直白的版本:

// 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");

我发现如果我将断言从
assert.throw(iThrowError(),Error,“Error thrown”)
to
expect(iThrowError).to.throw()这使测试通过,但它似乎不允许检查是否存在任何特定错误,我认为这会更有用。我想我仍然缺少一些东西。如果我想向函数传递一个参数,该怎么办?有什么方法可以做到这一点吗?Glen,要向函数传递参数,请尝试包装成一个函数:assert.throw(function(){iThrowError(args)},Error)我在使用Chai expect时遇到了类似的问题,我实际上是在调用函数,而不是传递引用。此解决方案解决了问题,谢谢@格伦塞尔,我以前也这么做过。e、 g.``函数打印(输入){console.log(输入)};var foo=print.bind(未定义的“我的字符串”);foo()//打印“我的字符串”``重复接受的答案有什么意义?@Louis这不是重复。公认的答案是将函数作为引用传递,而不是调用函数。正如我在回答的顶部所述,我正在解释如果测试需要调用函数,如何作为测试的一部分实际调用函数。
// 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");