mocha/chai return 未定义

mocha/chai return undefined

我有一个工作节点脚本,现在正在尝试学习 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 似乎未定义。所以我剥离了我的模块代码来测试 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);
  })
});

但这仍然return未定义。

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

如您所见,造成问题的主要原因之一是回调是异步的。因此,您不能像在原始示例中那样简单地从 findData 方法中 return 它。

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

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

在您修改后的示例中,尽管您使用的是回调,但您仍在测试 return 结果。您需要更改测试以使用回调的结果。

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