【问题标题】:mocha/chai return undefined摩卡/柴返回未定义
【发布时间】:2016-05-04 14:07:12
【问题描述】:

我有一个工作节点脚本,现在正在尝试学习 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 在 cmets 中所说的,我为函数添加了回调。

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);
  })
});

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

【问题讨论】:

  • 您已经展示了您的原始实现、您的原始测试代码和您的新实现,但您还应该展示您现在正在使用的新测试代码。理想情况下,您的问题应包含minimal reproducible example。
  • @Louis 不确定我是否理解您的评论。我说过我试图更改我的模块代码以使用回调,但这没有用。我没有更改我的测试代码。
  • 那么,如果你没有修改你的测试代码,为什么它完全可以工作呢?在您的测试代码中,您正在调用 findData(path) 而不传递回调,但您的新 findData 需要回调。
  • @Louise 我试图在我的期望测试中向函数添加回调,但它仍然返回未定义。

标签: node.js mocha.js chai


【解决方案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();
    });
});

【讨论】:

  • 非常感谢。这非常有效。我正在寻找我的 chai 代码而不是 mocha 的回调。
猜你喜欢
  • 2020-07-27
  • 2018-05-24
  • 2015-05-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
相关资源
最近更新 更多