【问题标题】:How to programmatically call yeoman generator?如何以编程方式调用 yeoman 生成器?
【发布时间】:2015-04-28 10:20:09
【问题描述】:

我需要一些提示来编写脚本来回答 yeoman 生成器的提示。

这是背景。我使用 yeoman 的 generator-generator 创建了自己的生成器。我添加了一些提示。为了在现在和将来的开发过程中测试模板项目,我需要生成一个示例项目并测试不断发展的模板。因为我想让 hudson 做测试例程,所以我需要自动化它(通过脚本回答这些提示)

出于我的需要,我未能在以下来源中找到相关信息:

  1. http://yeoman.github.io/generator/
  2. https://github.com/yeoman/generator,测试中有一些生成器调用代码,但我不知道如何使用 grunt 或节点脚本运行它。

以前有人做过吗?

--4 月 30 日更新--

我尝试使用以下脚本作为“test/test-app.js”:

var path = require('path');
var helpers = require('yeoman-generator').test;

describe('viena', function(){
  var options = { 'skip-install': true };
  var prompts = { 'scriptAppName': 'Viena' , "appTitle": "Test"};

  // Runs once:
  before(function(done){
    // This method creates temporary folder for test output
    // and clears it afterwards.
    helpers.setUpTestDirectory(path.join(__dirname, 'tmp'));
    done();
  });

  it('tests something', function(done){
    // Emulating user's prompts:
    helpers.run(path.join(__dirname, '../generators/app')).withPrompts(prompts);
    done();
  });
});

然后做了:

npm test

但我没能掌握生成的应用程序。我需要获取应用程序并运行为应用程序设计的测试。我不想检查是否复制了某些文件,但我想验证生成的应用程序是否通过了测试。这些测试属于应用而不是生成器。

【问题讨论】:

    标签: node.js gruntjs yeoman yeoman-generator


    【解决方案1】:

    如果我猜对了,你会尝试从 CI 开始测试(有点)。

    首先,确保您的package.json 中有类似的内容:

    "scripts": {
      "test": "mocha"
    }
    

    mocha 更改为您的自定义测试命令。

    然后在你的test/test-app.js:

    var helpers = require('yeoman-generator').test;
    
    describe('your-generator:app', function(){
      var options = { 'skip-install': true };
      var prompts = { 'promptName': 'promptValue' };
    
      // Runs once:
      before(function(done){
        // This method creates temporary folder for test output
        // and clears it afterwards.
        helpers.setUpTestDirectory(path.join(__dirname, 'tmp'));
        done();
      });
    
      // Runs before every test case:
      beforeEach(function(done){
        // This method specifies the working directory for test case:
        helpers.testDirectory(path.join(__dirname, 'tmp'), function(err){
          if (err){
            return done(err);
          }
    
          // This is yeoman's method for initializing a generator instance:
          yourApp = helpers.createGenerator(
            'your-generator:app', ['../../app'], false, options
          );
          done();
    
        }.bind(this));
      });
    
      it('tests something', function(done){
        // Emulating user's prompts:
        helpers.mockPrompt(yourApp, prompts);
        yourApp.run(function(){  // Runing your generator.
          // assert something
          done();
        });
      });
    });
    

    然后为您的 CI 编写一个脚本来运行 npm test。 这能解决您的问题吗?

    【讨论】:

    • 谢谢。您的建议启动了生成器,但我最终没有生成的应用程序。请看我的更新。我希望你能进一步提供帮助。
    • 您正在运行生成器的主应用程序(生成器本身)。你为什么不为类似于这个的应用程序创建第二个测试文件?只需更改 yourApp = helpers.createGenerator('your-generator:appName', ['../../appName'], false, options );helpers.run(path.join(__dirname,'../generators/appName')).withPrompts(prompts); 如果这对你有用(我没有尝试过这种语法)。
    【解决方案2】:

    这里有几件事。

    主要的是请阅读Yeoman testing documentation。有很多关于如何测试和对生成的应用程序进行断言的示例。

    接下来是您在此处调用的一些方法是异步的。只有在这些任务完成运行时才会调用 done 回调。在您的情况下,您同步调用它。所以生成器开始运行,但你不让它完成,你马上停止测试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多