使用 bowerInstall and/or npmInstall 测试 Yeoman 生成器
Testing Yeoman generator with bowerInstall and/or npmInstall
我有一个使用 this.bowerInstall()
的 Yeoman 生成器
当我测试它时,它会尝试安装我以这种方式初始化的所有 Bower 依赖项。有没有办法模拟这个函数?
this.npmInstall()
函数也是如此。
看看tests for the Bootstrap generator,它包含一个模拟bowerInstall()
函数的例子:
beforeEach(function (done) {
this.bowerInstallCalls = [];
// Mock bower install and track the function calls.
this.app.bowerInstall = function () {
this.bowerInstallCalls.push(arguments);
}.bind(this);
}.bind(this));
我最终采用了不同的方法。如果您手动引导测试生成器,drorb
的答案中的方法有效。如果您使用基于 RunContext
的设置(如 Yeoman(测试页面)[http://yeoman.io/authoring/testing.html] 中所述),测试的 before
块看起来像这样。
before(function (done) {
helpers.run(path.join( __dirname, '../app'))
.inDir(path.join( __dirname, './tmp')) // Clear the directory and set it as the CWD
.withOptions({ foo: 'bar' }) // Mock options passed in
.withArguments(['name-x']) // Mock the arguments
.withPrompt({ coffee: false }) // Mock the prompt answers
.on('ready', function (generator) {
// this is called right before `generator.run()`
})
.on('end', done);
})
您可以在 'ready'
回调中向生成器添加模拟函数,如下所示:
.on('ready', function(generator) {
generator.bowerInstall = function(args) {
// Do something when generator runs bower install
};
})
另一种方法是在生成器本身中包含一个选项。如:
installAngular: function() {
if (!this.options['skip-install']) {
this.bowerInstall('angular', {
'save': true
});
}
}
finalInstall: function() {
this.installDependencies({
skipInstall: this.options['skip-install']
});
}
现在,由于您 运行 使用 'skip-install' 选项进行测试,因此未安装依赖项。这具有确保命令行 skip-install
参数按预期工作的额外优势。在另一种情况下,即使您 运行 带有 skip-install
参数的生成器,生成器中的 bowerInstall
和 npmInstall
函数也会执行,尽管 installDependencies
功能不是(因为它通常配置如上)
我有一个使用 this.bowerInstall()
当我测试它时,它会尝试安装我以这种方式初始化的所有 Bower 依赖项。有没有办法模拟这个函数?
this.npmInstall()
函数也是如此。
看看tests for the Bootstrap generator,它包含一个模拟bowerInstall()
函数的例子:
beforeEach(function (done) {
this.bowerInstallCalls = [];
// Mock bower install and track the function calls.
this.app.bowerInstall = function () {
this.bowerInstallCalls.push(arguments);
}.bind(this);
}.bind(this));
我最终采用了不同的方法。如果您手动引导测试生成器,drorb
的答案中的方法有效。如果您使用基于 RunContext
的设置(如 Yeoman(测试页面)[http://yeoman.io/authoring/testing.html] 中所述),测试的 before
块看起来像这样。
before(function (done) {
helpers.run(path.join( __dirname, '../app'))
.inDir(path.join( __dirname, './tmp')) // Clear the directory and set it as the CWD
.withOptions({ foo: 'bar' }) // Mock options passed in
.withArguments(['name-x']) // Mock the arguments
.withPrompt({ coffee: false }) // Mock the prompt answers
.on('ready', function (generator) {
// this is called right before `generator.run()`
})
.on('end', done);
})
您可以在 'ready'
回调中向生成器添加模拟函数,如下所示:
.on('ready', function(generator) {
generator.bowerInstall = function(args) {
// Do something when generator runs bower install
};
})
另一种方法是在生成器本身中包含一个选项。如:
installAngular: function() {
if (!this.options['skip-install']) {
this.bowerInstall('angular', {
'save': true
});
}
}
finalInstall: function() {
this.installDependencies({
skipInstall: this.options['skip-install']
});
}
现在,由于您 运行 使用 'skip-install' 选项进行测试,因此未安装依赖项。这具有确保命令行 skip-install
参数按预期工作的额外优势。在另一种情况下,即使您 运行 带有 skip-install
参数的生成器,生成器中的 bowerInstall
和 npmInstall
函数也会执行,尽管 installDependencies
功能不是(因为它通常配置如上)