测试阵列长度时的摩卡测试超时

时间:2015-03-20 08:35:34

标签: javascript node.js tdd mocha

我正在使用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();
  });
});
  • 数据是数据库访问和功能的包装器。我在我的测试套件的之前方法中初始化它。
  • config.data 包含一个带有参数params(不相关)的对象
  • 公司是一个字符串数组
  • 群组是一个字符串数组

我遇到的问题是,当Mocha到达这条线时

expect(expansion).to.have.length(2);

并且长度与2不同,而不是像以下那样抛出错误:预期为2但长度为1它会因为超时而停止并抛出错误。

我确认测试已执行到该行。

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

该方法的预期行为是返回一个数组,其中相应的公司ID与属于该组对象的公司ID数组合并。

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

编辑由于可能重复:未在promise范围内执行的期望(在使用promises并在resolve或reject函数中执行expect时是捕获错误的承诺)。< / p>

提前致谢!

3 个答案:

答案 0 :(得分:1)

在这样的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: expected [ '464142414441464142414441',
  '464142414441464142414442',
  '464142414441464142414443',
  '464142414441464142414444' ] to have a length of 2 but got 4

而不是:

Error: timeout of 2000ms exceeded

这可能意味着什么。

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

虽然这个解决方案可能不如期望的那么优雅,但至少它提供了所需的反馈而不是超时。

答案 1 :(得分:1)

我相信这实际上是按预期工作的。

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

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

https://github.com/pouchdb/pouchdb/issues/1339#issuecomment-34739526

http://chaijs.com/guide/styles/#expect //搜索回调错误处理

Is there a way to get Chai working with asynchronous Mocha tests?

Mocha failed assertion causing timeout

编辑 - 实际上,我看到我倒退了,它肯定会抓住异常。我会再次查看原始代码,看看你是否有正确的一切。也许更新expect.js并查看它当前版本是否存在某些问题(或提交故障单)。我使用了期望库的chai,并且能够很好地解决它。 http://chaijs.com/

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

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

答案 2 :(得分:1)

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

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

我很确定您所看到的行为是因为使用了promises ...您是否在visibility.expand方法中使用了promise?