我正在尝试使用mock-fs来模拟文件系统内容以测试gulp任务。不幸的是,gulp.src
似乎与mock-fs
不太匹配。具体来说,我收到了ENOENT错误:
Message:
ENOENT, lstat '/vagrant/study-node-heroku/instances/development/app.json'
Details:
errno: -2
code: ENOENT
path: /vagrant/study-node-heroku/instances/development/app.json
domainEmitter: [object Object]
domain: [object Object]
domainThrown: false
Stack:
Error: ENOENT, lstat '/vagrant/study-node-heroku/instances/development/app.json'
at Error (native)
我的代码和测试代码的其他部分访问mock-fs
- 创建的文件就好了。
我做错了什么?我怀疑这个问题与gulp使用乙烯基有关。
这是测试中的功能:
var herokuTarball = function(options, done) {
var instance = options.instance || 'development';
var tarballName = options.tarballName || instance
var tarballPath = path.join(config.temp, tarballName + '.tar.gz');
var files = path.join(config.instances, instance, '**/*');
yassert.file(path.join(config.instances, instance, 'app.json'));
async.waterfall([
function(cb) {
del([tarballPath], cb);
},
function(err, cb) {
gulp.src(files)
.pipe(tar(tarballName + '.tar'))
.pipe(gzip())
.pipe(gulp.dest(config.temp))
.pipe(gcallback(cb));
}
], function(err, result) {
if (err) return err;
return done(err, tarballPath);
});
}
以下是测试片段:
describe('gulp heroku:tarball', function() {
after('something', function() {
mock.restore();
});
before('something', function() {
mock({
'instances/development': {
'app.json': 'test content'
}
});
});
it('creates a tarball', function(done) {
var options = {}
heroku.herokuTarball(options, function(err, result) {
expect(result).to.be.a('string');
yassert.file(result);
done();
});
});
});
请注意,yassert(yeoman-assert)调用传递正常 - 文件在那里。如果我从异步瀑布中取出gulp.src调用的函数,则错误消失(当然测试失败)。
的问题答案 0 :(得分:0)
你没有做错任何事,mock-fs README声明:
注意 mock-fs与graceful-fs@3.x不兼容,但与graceful-fs@4.x兼容。
查看gulp的依赖关系:
$ npm info gulp devDependencies.graceful-fs
^3.0.0
因此,gulp仍然依赖于graceful-fs@3.x,因此mock-fs将不起作用。
YMMV,但也许vinyl-fs-mock是另一种选择?