Javascript 如何为读取package.json的子生成器设置yeoman测试

Javascript 如何为读取package.json的子生成器设置yeoman测试,javascript,node.js,mocha.js,yeoman,Javascript,Node.js,Mocha.js,Yeoman,我有一个子生成器,它使用package.json中的名称。现在我想测试该函数,并编写了一个before()的,它应该为测试创建一个虚拟package.json 问题是子生成器无法读取伪json文件 测试文件: before(function (done) { helpers.run(path.join( __dirname, '../addcomponent')) .inDir(path.join( __dirname, './tmp'), function(dir) { f

我有一个子生成器,它使用package.json中的名称。现在我想测试该函数,并编写了一个before()的
,它应该为测试创建一个虚拟package.json

问题是子生成器无法读取伪json文件

测试文件:

before(function (done) {

  helpers.run(path.join( __dirname, '../addcomponent'))
  .inDir(path.join( __dirname, './tmp'), function(dir) {

    fs.copyTpl(
      path.join(__dirname, '../app/templates/_package.json'),
      dir + 'package.json',
      { ProjectName: 'foo' }
    );

    var test = fs.readJSON(dir + 'package.json');
    console.log('test: ' + test); // returns the object
    console.log('test.name: ' + test.name); // returns the correct name

  })
  .withArguments(['foo'])
  .withPrompts(prompts)
  .withOptions(options)
  .on('end', done);

});
但在我的子生成器中:

var memFs = require('mem-fs');
var editor = require('mem-fs-editor');
var store = memFs.create();
var fs = editor.create(store);

...

init: function() {
  this.pkg = this.fs.readJSON('package.json');
  console.log('this.pkg: ' + this.pkg); // returns undefined
}
// or
init: function() {
  this.on('ready', function() {
    this.pkg = this.fs.readJSON('package.json');
    console.log('this.pkg: ' + this.pkg); // returns undefined
  });
}
// or
anyOther: function() {
  this.pkg = this.fs.readJSON('package.json');
  console.log('this.pkg: ' + this.pkg); // returns undefined
}
整个设置可在此处找到:

感谢您的帮助编辑:我将保留旧答案,这可能与大多数遇到此问题的人有关,但与您无关

memfs
背后的想法是在内存中存储。它不会自动将任何内容写入磁盘。因此,它将状态保持在
memfs
实例中。在本例中,您正在创建自己的mem fs实例,而yeoman正在使用另一个实例。这意味着您写入的文件从未被Yeoman看到(也从未写入磁盘)

对于您来说,修复方法是使用提供的生成器实例作为
ready
事件的第一个参数

helpers.run(path.join( __dirname, '../addcomponent'))
  .on('ready', function (generator) {
    generator.fs.write('file.txt', 'foo');
  });
另一个选项是使用node.js sync
fs
方法。(
fs.writeFileSync()
等)


我猜您正在生成器构造函数中使用
this.fs.readJSON()

构造函数在触发
ready
事件之前初始化。这意味着您在实际写入文件之前读取了该文件

通常的解决方法是永远不要在构造函数内部读取。您可以将此步骤延迟到
初始化
阶段,此时
inDir()
(或
就绪
事件)回调已运行


作为旁注,您应该使用
inTmpDir()
而不是
inDir()

谢谢您的研究。我在上面的原始问题中添加了对
this.fs.readJSON()。我也从不过度编写构造函数。您可以在这里看到整个文件:我已经在上面的问题中添加了
this.fs.readJSON()
的定义,但我认为使用生成器的fs很快就会被弃用?不,你看错了。我们谈论的是旧式文件系统帮助程序,
this.copy
this.write
,等等。
this.fs
是处理Yeoman中文件的全新方式。