Javascript 测试阵列长度时的Mocha测试超时

Javascript 测试阵列长度时的Mocha测试超时,javascript,node.js,tdd,mocha.js,Javascript,Node.js,Tdd,Mocha.js,我正在用mocha和expect.js测试一个小节点模块,我有点头疼 这是测试定义: it('Should return an expansion array that contains all the objects that comes along within a single group', function (done) { visibility.expand(data, config.data, companies, groups, function (error, expan

我正在用mocha和expect.js测试一个小节点模块,我有点头疼

这是测试定义:

it('Should return an expansion array that contains all the objects that comes along within a single group', function (done) {

  visibility.expand(data, config.data, companies, groups, function (error, expansion) {

    expect(error).to.be(null);
    expect(expansion).to.be.an('array');
    expect(expansion).to.have.length(2);
    expect(expansion.toString()).to.eql([testCompaniesIds[2], testCompaniesIds[3]].toString());

    done();
  });
});
  • 数据是数据库访问和功能的包装器。我在测试套件的before方法中初始化它
  • config.data保存具有配置参数(不相关)的对象
  • 公司是一个字符串数组
  • 组是字符串数组
我面临的问题是,当摩卡到达这条线时

expect(expansion).to.have.length(2);
长度不同于2,而不是抛出一个错误,如:预期为2,但长度为1,它只是停止并抛出一个错误,因为超时

我验证了测试一直执行到那一行

更多信息:我正在测试的方法接收一个公司名称数组和一个组名称数组。每个组都包含一个公司数据库id数组

该方法的预期行为是返回一个具有相应公司id的数组,该数组与属于组对象的公司id数组合并

编辑2由于可能重复:我错了。它确实是在承诺的范围内执行的

编辑由于可能重复:不在承诺范围内执行的期望(在resolve或reject函数中使用承诺并执行expect时,捕获错误的承诺)


提前谢谢

将所有测试包装在一个try-catch之间,如下所示:

it('Should return an expansion array that contains all the objects that comes along within a single group', function (done) {

  visibility.expand(data, config.data, [testCompanies[0].name, testCompanies[1].name], [testGroups[0].name, testGroups[1].name], function (error, expansion) {
    try {
      expect(error).to.be(null);
      expect(expansion).to.be.an('array');
      expect(expansion).to.have.length(2);

      expect(checkIdIsContainedInArray(testCompaniesIds[0], expansion)).to.be(true);
      expect(checkIdIsContainedInArray(testCompaniesIds[1], expansion)).to.be(true);
      expect(checkIdIsContainedInArray(testCompaniesIds[2], expansion)).to.be(true);
      expect(checkIdIsContainedInArray(testCompaniesIds[3], expansion)).to.be(true);

      done();
    } catch (e) {
      done(e);
    }
  });
});
此测试因数组长度(为4,应为2)而引发错误:

而不是:

Error: timeout of 2000ms exceeded
这可能意味着什么

调试expect.js时,我看到它抛出了一个错误,但Mocha没有捕获它

尽管此解决方案可能没有预期的那么优雅,但至少它提供了预期的反馈,而不是超时。

我相信这确实如预期的那样工作

Mocha测试只能在实际调用done()时结束异步调用。由于错误被抛出到mocha执行上下文的范围之外,因此它永远不会到达该代码块,并且执行基本上没有时间

我似乎找不到任何官方文件说明这一点,但这里有一些(希望有点相关?)参考资料-

//搜索有关回调的错误处理

编辑-事实上,我看到它是向后的,它肯定会捕获异常。我会再次查看原始代码,看看是否一切都正确。也许可以更新expect.js,看看它在您当前的版本上是否有一些问题(或者提交一张罚单)。我将chai与expect库一起使用,并能够将其设置为正确的错误

正确抛出错误的代码示例-

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

describe('something', function () {

    var j = [1];

    it('does something.. ', function (done) {
        setInterval(function () {
            console.log('its done');
            expect(j).to.be.length(2);
            done();
        }, 1000);
    });

});  

//Uncaught AssertionError: expected [ 1 ] to have a length of 2 but got 1

您正在回调函数中执行期望值

这意味着代码正在visibility.expand方法中执行


我很确定你看到的这种行为是因为使用了承诺。。。您是否在visibility.expand方法中使用了承诺?

您是否尝试过:expect(expansion.length).to.be(2)?是的,如果长度不是2,效果是相同的,如果您逐个测试每一行(通过注释其他行),测试是否通过?或者,如果没有,它会在哪一行失败?我只是尝试删除除该行之外的所有预期行,但由于超时而失败。它的长度不够长。好的。因此,超时的原因是done函数没有被调用,或者调用的时间太长(我认为2秒是mocha的默认超时设置)。因此,要么在太长时间后调用回调,要么行花费太多时间/卡在无限循环中,要么在某个点重新定义了done函数,而没有调用“正确的”done函数。我仍然想知道为什么会发生这种情况hi Justin。这是有道理的,但是我在expect.js中使用了其他测试,它们抛出了一个错误,Mocha能够捕获它。我对这一切有点困惑。顺便说一下,谢谢你的推荐。嗯,很有趣。我认为这不是expect.js的问题,因为它正在检测错误并抛出它。我将尝试更多地了解摩卡咖啡,当然我会尝试chai的expect方法。
var chai = require('chai')
    , expect = chai.expect;

describe('something', function () {

    var j = [1];

    it('does something.. ', function (done) {
        setInterval(function () {
            console.log('its done');
            expect(j).to.be.length(2);
            done();
        }, 1000);
    });

});  

//Uncaught AssertionError: expected [ 1 ] to have a length of 2 but got 1