Javascript 带有expect的mocha不适用于测试错误

Javascript 带有expect的mocha不适用于测试错误,javascript,node.js,mocha.js,chai,Javascript,Node.js,Mocha.js,Chai,在下面的脚本中,只有一个测试通过。测试错误(throw error())失败,消息为 1) 测试应抛出错误: var expect=require('chai')。expect; 描述(“测试”,函数(){ var-fn; 在(函数()之前){ fn=功能(arg){ 如果(arg=='error'){ 抛出新错误(); }否则{ 返回“hi”; } } }); 它(“应该抛出错误”,函数(){ expect(fn('error')).to.throw(error); }); 它(“应该返回

在下面的脚本中,只有一个测试通过。测试错误(throw error())失败,消息为 1) 测试应抛出错误:

var expect=require('chai')。expect;
描述(“测试”,函数(){
var-fn;
在(函数()之前){
fn=功能(arg){
如果(arg=='error'){
抛出新错误();
}否则{
返回“hi”;
} 
}
});
它(“应该抛出错误”,函数(){
expect(fn('error')).to.throw(error);
});
它(“应该返回hi”,函数(){
期望(fn('hi'))等于('hi');
});
});
expect()
需要调用函数,而不是函数的结果

将代码更改为:

expect(function(){ fn("error"); }).to.throw(Error);

如果您使用错误优先回调的节点方式执行此操作,则看起来更像这样:

var expect = require('chai').expect;

describe("a test", function() {
  var fn;
  before(function() {
    fn = function(err, callback){
        if(err) throw new Error('failure');

        return callback();
    }
  });

  it("should throw error", function() {
    expect(fn('error')).to.throw(Error);
  });
  it("should return hi", function() {
    var callback = function() { return 'hi' };
    expect(fn(null, callback).to.equal('hi');
  });
});

不,文档是正确的。关键是必须传入Chai将调用的函数对象。在您的示例中,您正在调用函数,并将结果传递给
expect()
。那么为什么要使用expect(fn('hi')).to.equal('hi');有效?因为,在这种情况下,您运行函数并返回“hi”。然后将字符串传递给expect(),并询问它是否等于另一个字符串。在测试抛出错误的情况下,这是无法完成的,因为expect无法捕获错误,除非它调用它。如果它现在对您有效,您也可以接受我的答案吗?这同样适用于。仔细阅读文档,了解函数和函数调用返回值之间的区别您是否尝试过代码?你的期望会失败。正如我在回答中所说,它需要调用一个函数,而不是函数的结果。