我有一个工作节点脚本,我现在正在尝试学习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);
})
});
但是这仍然会返回一个未定义的。
答案 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();
});
});