编写自己的Yeoman生成器-8.测试生成器

继续阅读以了解有关Yeoman添加的测试助手的更多信息,以减轻单元测试生成器的痛苦。

以下示例假设您在BDD模式下使用Mocha。全局概念应该很容易应用于您选择的单元测试框架

组织你的测试

保持测试简单易于编辑非常重要。

通常,组织测试的最佳方法是将每个生成器和子生成器分隔为自己的describe块。然后,describe为您的生成器接受的每个选项添加一个块。然后,it为每个断言(或相关断言)使用一个块。

在代码中,您应该得到类似于此的结构:

1
2
3
4
5
6
7
8
describe('backbone:app', function () {
it('generates a project with require.js', function () {
// assert the file exist
// assert the file uses AMD definition
});

it('generates a project with webpack');
});

测试助手

Yeoman提供测试助手方法。它们包含在yeoman-test包装内。

1
var helpers = require('yeoman-test');

您可以在此处查看完整的帮助程序API

单元测试生成器时最有用的方法是helpers.run()。此方法将返回一个RunContext实例,您可以在该实例上调用方法来设置目录,模拟提示,模拟参数等。

1
2
3
4
5
6
7
8
9
10
11
12
13
var path = require('path');

it('generate a project', function () {
// The object returned acts like a promise, so return it to wait until the process is done
return helpers.run(path.join(__dirname, '../app'))
.withOptions({ foo: 'bar' }) // Mock options passed in
.withArguments(['name-x']) // Mock the arguments
.withPrompts({ coffee: false }) // Mock the prompt answers
.withLocalConfig({ lang: 'en' }) // Mock the local config
.then(function() {
// assert something about the generator
});
})

有时您可能希望为生成器构建一个测试场景,以便与目标目录中的现有内容一起运行。在这种情况下,您可以inTmpDir()使用回调函数调用,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
var path = require('path');
var fs = require('fs-extra');

helpers.run(path.join(__dirname, '../app'))
.inTmpDir(function (dir) {
// `dir` is the path to the new temporary directory
fs.copySync(path.join(__dirname, '../templates/common'), dir)
})
.withPrompts({ coffee: false })
.then(function () {
assert.file('common/file.txt');
});

您还可以在回调中执行异步任务:

1
2
3
4
5
6
7
8
9
var path = require('path');
var fs = require('fs-extra');

helpers.run(path.join(__dirname, '../app'))
.inTmpDir(function (dir) {
var done = this.async(); // `this` is the RunContext object.
fs.copy(path.join(__dirname, '../templates/common'), dir, done);
})
.withPrompts({ coffee: false });

运行Promise将解析运行生成器的目录。如果要使用运行生成器的临时目录,这将非常有用:

1
2
3
4
5
6
7
8
9
helpers.run(path.join(__dirname, '../app'))
.inTmpDir(function (dir) {
var done = this.async(); // `this` is the RunContext object.
fs.copy(path.join(__dirname, '../templates/common'), dir, done);
})
.withPrompts({ coffee: false })
.then(function (dir) {
// assert something about the stuff in `dir`
});

如果您的生成器调用composeWith(),您可能想要模拟那些依赖生成器。使用#withGenerators(),传递#createDummyGenerator()用作第一项的数组数组和模拟生成器的命名空间作为第二项:

1
2
3
4
var deps = [
[helpers.createDummyGenerator(), 'karma:app']
];
return helpers.run(path.join(__dirname, '../app')).withGenerators(deps);

如果你不喜欢Promise,你可以使用’ready’,’error’以及’end’事件发出:

1
2
3
4
5
6
7
8
helpers.run(path.join(__dirname, '../app'))
.on('error', function (error) {
console.log('Oh Noes!', error);
})
.on('ready', function (generator) {
// This is called right before `generator.run()` is called
})
.on('end', done);

您还可以运行将其作为模块导入的生成器。如果生成了生成器的源代码,这将非常有用。

您需要提供以下设置run:

  • resolved:生成器的路径,例如 ../src/app/index.js
  • namespace:生成器的命名空间,例如 mygenerator:app
1
2
3
4
5
6
var MyGenerator = require('../src/app');

helpers.run(MyGenerator, {
resolved: require.resolve(__dirname, '../src/app/index.js'),
namespace: 'mygenerator:app'
});

断言助手

Yeoman 使用生成器相关的断言助手扩展了本机断言模块。您可以在yeoman-assert存储库中看到断言助手的完整列表。

需要断言助手:

1
var assert = require('yeoman-assert');

存在文件断言

1
assert.file(['Gruntfile.js', 'app/router.js', 'app/views/main.js']);

assert.noFile() 断言相反。

断言文件内容

1
assert.fileContent('controllers/user.js', /App\.UserController = Ember\.ObjectController\.extend/);

assert.noFileContent() 断言相反。

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2021 朝着牛逼的道路一路狂奔 All Rights Reserved.

访客数 : | 访问量 :