如何以编程方式调用自动生成器?

时间:2015-04-28 10:20:09

标签: node.js gruntjs yeoman yeoman-generator

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

这是背景资料。我使用yeoman的发电机 - 发电机创建了自己的发电机。我添加了一些提示。为了现在和将来的开发中测试模板项目,我需要生成一个示例项目并测试不断发展的模板。因为我希望哈德森做测试例程,我需要自动化它(通过脚本回答这些提示)

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

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

    - 更新30/4月 -

    我尝试将以下脚本作为'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
    

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

1 个答案:

答案 0 :(得分:3)

如果我做对了,你就要从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。 这会解决您的问题吗?