如何为读取 package.json 的子生成器设置 yeoman 测试
How to setup yeoman test for subgenerator that reads package.json
我有一个使用 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
}
整个设置可以在这里找到:https://travis-ci.org/markusfalk/generator-kickstart/builds/58892092
感谢您的帮助
编辑:我会保留旧答案,这可能与大多数 运行关注此问题的人相关,但与您无关。
mem-fs
背后的想法是在内存中存储。它不会自动将任何内容写入磁盘。因此,它将状态保持在 mem-fs
实例中。在这种情况下,您正在创建自己的 mem-fs 实例,而 yeoman 使用另一个实例。这意味着你写的文件永远不会被 Yeoman 看到(也永远不会写入磁盘)。
对于您来说,解决方法是使用作为 ready
事件的第一个参数提供的生成器实例。
helpers.run(path.join( __dirname, '../addcomponent'))
.on('ready', function (generator) {
generator.fs.write('file.txt', 'foo');
});
另一种选择是使用 node.js 同步 fs
方法。 (fs.writeFileSync()
, 等等)
我猜你在生成器构造函数中使用了 this.fs.readJSON()
。
构造函数在 ready
事件触发前初始化。这意味着您在实际写入文件之前读取了该文件。
通常的解决方法是从不读取构造函数内部。您可以将此步骤延迟到 initializing
阶段,其中 inDir()
(或 ready
事件)回调具有 运行.
作为旁注,您应该使用 inTmpDir()
而不是 inDir()
我有一个使用 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
}
整个设置可以在这里找到:https://travis-ci.org/markusfalk/generator-kickstart/builds/58892092
感谢您的帮助
编辑:我会保留旧答案,这可能与大多数 运行关注此问题的人相关,但与您无关。
mem-fs
背后的想法是在内存中存储。它不会自动将任何内容写入磁盘。因此,它将状态保持在 mem-fs
实例中。在这种情况下,您正在创建自己的 mem-fs 实例,而 yeoman 使用另一个实例。这意味着你写的文件永远不会被 Yeoman 看到(也永远不会写入磁盘)。
对于您来说,解决方法是使用作为 ready
事件的第一个参数提供的生成器实例。
helpers.run(path.join( __dirname, '../addcomponent'))
.on('ready', function (generator) {
generator.fs.write('file.txt', 'foo');
});
另一种选择是使用 node.js 同步 fs
方法。 (fs.writeFileSync()
, 等等)
我猜你在生成器构造函数中使用了 this.fs.readJSON()
。
构造函数在 ready
事件触发前初始化。这意味着您在实际写入文件之前读取了该文件。
通常的解决方法是从不读取构造函数内部。您可以将此步骤延迟到 initializing
阶段,其中 inDir()
(或 ready
事件)回调具有 运行.
作为旁注,您应该使用 inTmpDir()
而不是 inDir()