Javascript 摩卡/柴异步测试&x27;完成();fn不工作

Javascript 摩卡/柴异步测试&x27;完成();fn不工作,javascript,unit-testing,backbone.js,mocha.js,chai,Javascript,Unit Testing,Backbone.js,Mocha.js,Chai,我正在测试一个银行模型,如下所示: describe('Bank Model - Ajax', function () { it('loads bank', function (done) { var bank = new Bank(); bank.OnLoaded = _(function () { expect(this.id).to.eql(1171); expect(true).to.eql(f

我正在测试一个银行模型,如下所示:

describe('Bank Model - Ajax', function () {

    it('loads bank', function (done) {

        var bank = new Bank();

        bank.OnLoaded = _(function () {
            expect(this.id).to.eql(1171);
            expect(true).to.eql(false);
            done();
        }).bind(bank);

        bank.load(1171);


    });
});
load调用向我的服务器发出ajax请求。我的问题是
expect(true).to.eql(false)
抛出一个
未捕获断言错误
,我不确定原因。我使用的是推荐的Mocha策略,即以“完成”结束我的测试用例。我做错了吗


谢谢。

你没有做错什么。Mocha不容易捕获回调中抛出的异常,因为它们是在测试函数完成后执行的,因此任何失败的断言都是未捕获的致命错误,而不是通常通过同步代码得到的良好差异

人们正在采取一些变通办法,例如,或。但目前看来,它的表现仍不理想

由于
done
方法接受一个包含错误的参数,因此您可以向测试中添加代码来捕获回调中的异常,并将它们传递给catch块中的
done(err)
。但很快就会变得一团糟

可以使用以下某种辅助功能减少重复:

function catching(done, fn) {
  try {
    fn();
    done();
  } catch(err) {
    done(err);
  }
}
然后:

bank.OnLoaded = catching(done, _(function () {
  expect(this.id).to.eql(1171);
  expect(true).to.eql(false);
}).bind(bank));

嗯,您期望的是
true==false
?@muistooshort关键是断言应该被测试用例捕获;它不应该是一个未捕获的错误。但是当断言失败时,
expect…
东西不会引发异常吗?我不是Mocha或Chai方面的专家,所以我可能遗漏了一些明显的东西。是的,确实如此,但是这些异常应该被测试用例捕获,断言错误的结果会很好地打印在我的TestRunner页面上。这种情况不会发生。谢谢你的回复。我曾假设,因为引用的回调在it()调用中,所以不会从内存中删除it()fn,因为在某个地方有对该回调的引用。这不准确吗?就内存而言,是的,由于回调函数在它内部,所以它()函数的闭包是保持的。但是回调函数是在it()函数之外调用的,因此它不能以传统方式捕获任何异常。当异常发生时,it()函数已经完成。