2015-04-28 28 views
0

我需要一些提示来编写脚本来回答yeoman生成器的提示。如何以编程方式调用yeoman生成器?

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

对于我的需求,我没能找到在以下来源的相关信息:

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

有没有人以前做过这个?

--update 30/April--

我尝试下面的脚本为 '测试/测试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 

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

回答

2

如果我确定了正确的话,你就要开始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的脚本。 这是否解决您的问题?

+0

谢谢。你的建议让发电机启动,但我最终没有生成应用程序。请参阅我的更新。我希望你能进一步提供帮助。 – chfw

+0

您正在运行发电机的主要应用程序(发电机本身)。为什么不为这个应用程序创建与此类似的第二个测试文件?只需更改'yourApp = helpers.createGenerator('your-generator:appName',['../../appName'],false,options);'或'helpers.run(path.join(__ dirname,'../generators/appName'))。withPrompts(prompts);'如果这对你有效(我没有试过这个语法)。 – sobolevn

0

这里有几件事。

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

接下来是你在这里调用的一些方法是异步的。完成的回调仅在这些任务完成时才被调用。在你的情况下,你可以同时调用它。所以发电机开始运转,但你不让它结束,你马上停止测试。