`fs.readdir`在测试中返回undefined

时间:2015-05-20 10:59:29

标签: node.js fs

我的getFiles模块我有方法_get来获取目录中的文件。然后,它将用于读取每个文件的内容并将其上载到S3存储桶。但是,当我运行getFiles的测试时,files的值为undefined

我在这里缺少什么?

我的模块所在的文件readDirectory.js

'use strict';

var fs = require('fs');

var _getFiles = {};

_getFiles._get = function (path, callback) {
    fs.readdir(path, function (error, files) {
        console.log(path);
        console.log(files);
        callback(files);
    });
};

module.exports = _getFiles;

使用mochachaision进行测试:

describe("readDirectory run", function () {
    var testedModule, callbackSpy, readFileStub;

    before(function () {

        readFileStub = sinon.stub();

        callbackSpy = sinon.spy();

        testedModule = require('../readDirectory.js');

        mockDir({
            tmp: {
                images: {
                    "thumb_test.txt": "thumbnail pic",
                    "small_test.txt": "small pic",
                    "medium_test.txt": "medium pic"
                }
            }
        });
    });

    after(function () {
        mockDir.restore();
    });

    it("returns list of files", function () {
        testedModule._get(mockDir, function () {console.log(files);});
    });
});

这是测试的结果,除了运行代码之外,它还没有测试任何东西:

readDirectory run
    ✓ returns list of files
{ [Function: mock]
  restore: [Function],
  fs: [Function],
  file: [Function],
  directory: [Function],
  symlink: [Function] }
undefined

1 个答案:

答案 0 :(得分:0)

Ben Fortune的答案在达成解决方案时具有确定性,但不完整。

在将测试目录传递给测试模块时,我错误地使用了模拟目录。所以不是我在问题中的内容,而应该是:

....
it("returns list of files", function () {
        testedModule._get("tmp/images/", function (files) {
            console.log("Files from callback, %s", files);
        });
    });
....

请注意我不再将对象mockDir作为testedModule的第一个参数传递,而是将我创建的目录模拟的实际路径tmp/images/