【问题标题】:Mocha/Chai async tests 'done()' fn not workingMocha/Chai 异步测试 'done()' fn 不工作
【发布时间】:2013-11-23 18:05:39
【问题描述】:

我正在测试我的银行模型如下:

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 策略来结束我的测试用例。我做错了吗?

谢谢。

【问题讨论】:

  • 嗯,你期待true === false
  • @muistooshort 关键是断言应该被测试用例捕获;这不应该是未捕获的错误。
  • 但是当断言失败时expect... 的东西不会引发异常吗?我不是摩卡或柴的专家,所以也许我遗漏了一些明显的东西。
  • 是的,但是这些异常应该被测试用例捕获,并且断言错误的结果很好地打印在我的 TestRunner 页面上。在这种情况下不会发生这种情况。

标签: javascript unit-testing backbone.js mocha.js chai


【解决方案1】:

你没有做错任何事。 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));

【讨论】:

  • 感谢您的回复。我假设因为回调被引用在 it() 调用中,所以 it() fn 不会从内存中删除,因为某处有对该回调的引用。这不准确吗?
  • 就内存而言,是的,it() 函数的闭包得到了维护,因为回调在其中。但是回调是在 it() 函数之外调用的,所以它不能以传统方式捕获任何异常。到异常发生时,it() 函数已经完成。
猜你喜欢
  • 1970-01-01
  • 2018-03-06
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多