摩卡/柴异步测试'完成()' fn不工作

时间:2013-11-11 20:00:14

标签: javascript unit-testing backbone.js mocha 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(false);
            done();
        }).bind(bank);

        bank.load(1171);


    });
});

加载调用向我的服务器发出ajax请求。我的问题是expect(true).to.eql(false);抛出一个Uncaught Assertion Error,我不知道为什么。我正在使用推荐的Mocha策略来结束我的测试用例。我做错了吗?

感谢。

1 个答案:

答案 0 :(得分:9)

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

人们正在研究providing a custom method that assertion libraries can call instead of throwingusing Node Domains when running in Node等变通方法。但是现在似乎仍然没有理想的表现。

由于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));