mocha / chai返回undefined

时间:2016-05-04 14:07:12

标签: node.js mocha chai

我有一个工作节点脚本,我现在正在尝试学习mocha / chai来添加一些单元测试。

//Module Code
var path = require('path');
var recursive = require('recursive-readdir');


function findData(folderPath) {
  recursive(folderPath, function (err, files) {
    return files;
  });
};

module.exports.findData = findData;

我的摩卡测试代码:

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

describe('checkData', function () {
  var findData = require('../custom_modules/findData').findData;
  var path;

  before (function () {
    path = '/Data'
  });

  it('should have 53 files in array', function () {
    expect(findData(path)).to.have.lengthOf(53);
  })

});

然而,它总是失败,因为返回似乎是未定义的。所以我把我的模块代码剥离回来测试return true,并且有效。

所以它必须是递归模块的异步性质,所以我尝试将回调添加到我的模块代码中:

var path = require('path');
var recursive = require('recursive-readdir');


function findData(folderPath, cb) {
  recursive(folderPath, function (err, files) {
    cb(null, files);
  });
};

module.exports.findData = findData;

但这也不起作用。

奇怪的是,如果我运行node index.js,我会得到文件列表。

任何人都可以向我解释这段代码是如何正常工作的,但是当我尝试使用mocha / chai来测试时,我得到了未定义的内容吗?

由于

编辑:

因此,基于@Louis在评论中所说的内容,我添加了对该函数的回调。

describe('checkData', function () {
  var findData = require('../custom_modules/findData').findData;
  var path;
  var files;

  before (function () {
    path = '/Users/tjmartin/Documents/OSData/OpenNames/Data'
  });

  it('should have 53 files in array', function () {
    expect(findData(path, function(results) {
        files = results;
      })).to.have.lengthOf(53);
  })
});

但是这仍然会返回一个未定义的。

1 个答案:

答案 0 :(得分:1)

首先,我会在你的findData实现中记录错误的结果。即使只是在开发过程中,您也可以轻松查看是否有任何错误报告(您可能已经这样做了,只是想提一下)。

正如您所发现的,问题的主要原因之一是回调是异步的。因此,您不能像在原始示例中那样从findData方法返回它。

接下来,我不会像在before函数中那样对路径进行硬编码。而是使用本地路径,以便测试可以作为CI的一部分运行(如果有的话),或者甚至可以在另一台机器上抓取它并让它在那里工作。

before(function() {
    path = './tests/TestData';
});

在您修改过的示例中,虽然您正在使用回调,但您仍在测试返回结果。您需要更改测试以使用回调的结果。

it('should have 53 files in array', function(done) {
    findData(path, function(results) {
        expect(results).to.have.lengthOf(53);
        done();
    });
});