【问题标题】:Testing Yeoman generator with bowerInstall and/or npmInstall使用 bowerInstall 和/或 npmInstall 测试 Yeoman 生成器
【发布时间】:2015-01-26 23:41:51
【问题描述】:

我有一个使用 this.bowerInstall() 的 Yeoman 生成器

当我测试它时,它会尝试安装我以这种方式初始化的所有 bower 依赖项。有没有办法模拟这个函数?

this.npmInstall() 函数也是如此。

【问题讨论】:

    标签: mocha.js yeoman bower yeoman-generator


    【解决方案1】:

    我最终采用了不同的方法。如果您手动引导测试生成器,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 参数运行生成器,生成器中的bowerInstallnpmInstall 函数也会执行,即使installDependencies 函数不是(因为它通常配置为如上)

    【讨论】:

      【解决方案2】:

      查看tests 中的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));
      

      【讨论】:

      • 我想这可能有效。我没有使用示例使用的手动引导,所以我不得不采用另一种方法。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-05
      • 2018-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多