12

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

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);抛出一个Uncaught Assertion Error,我不知道为什么。我正在使用推荐的 Mocha 策略来结束我的测试用例。我做错了吗?

谢谢。

4

1 回答 1

9

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

人们正在研究解决方法,例如提供断言库可以调用而不是 throwing 的自定义方法,或者在 Node 中运行时使用 Node Domains。但就目前而言,它的表现似乎仍然不理想。

由于该done方法接受包含错误的单个参数,因此您可以将代码添加到测试中以在回调中捕获异常并将它们传递到done(err)catch 块内。但它会很快变得非常混乱。

可以使用某种辅助函数来减少重复,如下所示:

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));
于 2013-12-04T14:00:13.737 回答