理解 Grunt test 任务在您键入 grunt test 时,希望您会问自己,“嗯,我想知道 Grunt 如何运行这些测试。”如您已经知道的,Grunt 运行您的构建脚本。在文本编辑器中打开 gruntfile.js 并一直滚动到文件底部。您可以看到 test 任务正在注册:
1
2
| // Test task.
grunt.registerTask('test', ['env:test', 'mochaTest', 'karma:unit']);
|
grunt.registerTask 的第一个参数是任务的名称 — 在本例中为 test。下一个参数是一个依赖任务数组。test 任务首先设置特定于测试环境的值,然后运行所有在 Mocha 中编写的服务器端测试,最后通过 Karma 启动客户端测试。
在 gruntfile.js 中稍微向上滚动,直到找到 env 任务:
1
2
3
4
5
| env: {
test: {
NODE_ENV: 'test'
}
},
|
此任务仅用于将 NODE_ENV 变量设置为 test。回想一下,此变量帮助 Grunt 确定哪些特定于环境的设置(在本例中位于 config/env/test.js)将会与 config/env/all.js 中的通用设置合并。
如果在文本编辑器中查看 config/env/test.js(如清单 2 所示),就会看到一个自定义的 MongoDB 连接字符串,以及针对各种 OAuth 提供程序的所有 Passport 设置的挂钩(hooks):
清单 2. config/env/test.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| 'use strict';
module.exports = {
db: 'mongodb://localhost/test-test',
port: 3001,
app: {
title: 'Test - Test Environment'
},
facebook: {
clientID: process.env.FACEBOOK_ID || 'APP_ID',
clientSecret: process.env.FACEBOOK_SECRET || 'APP_SECRET',
callbackURL: 'http://localhost:3000/auth/facebook/callback'
},
google: {
clientID: process.env.GOOGLE_ID || 'APP_ID',
clientSecret: process.env.GOOGLE_SECRET || 'APP_SECRET',
callbackURL: 'http://localhost:3000/auth/google/callback'
},
// snip
};
|
这一节是您将 Passport 指向 Meetup 身份验证战略的一个模拟实现的理想位置。因此,在测试运行期间,您就不需要依靠实际用户进行设置,并向 Meetup.com 发送实际的 OAuth 请求。
完成测试环境配置后,Grunt 将会运行您在 Mocha 中编写的所有服务器端测试。以下是 mochaTest 任务:
1
2
3
4
5
6
7
| mochaTest: {
src: watchFiles.mochaTests,
options: {
reporter: 'spec',
require: 'server.js'
}
},
|
旋钮(Knobs)和转盘(dials)有关您在运行 Mocha 测试时可调节的旋钮和转盘的更多信息,请参阅 中的 grunt-mocha-test。
为什么是 Mocha 中编写的服务器端测试,而不是 Jasmine?Mocha 的成熟度、可扩展性和插件使它成为了我最喜爱的测试框架之一。Mocha 是测试 Express 路由、控制器和 MongoDB 交互等方面的可靠的选择。尽管 Mocha 可以轻松地在 Node.js 和浏览器中运行测试,但 AngularJS 团队更喜欢使用 Jasmine 来执行浏览器中的测试。Jasmine 针对客户端测试进行了更多优化,所以 MEAN.JS 开发人员采取了一种一流的方法,并选择了一个强大的服务器端测试框架来测试服务器端,选择了一个强大的客户端测试框架来测试客户端。您应该习惯交替使用两种框架来使用您首选的测试工具。
因为服务器端测试(根据定义)不在浏览器中运行,所以 Mocha 测试不会由 Karma 启动。Jasmine 测试(Grunt test 依赖项的最后部分)由 karma 任务触发:
1
2
3
4
5
| karma: {
unit: {
configFile: 'karma.conf.js'
}
}
|
在继续分解 karma.conf.js 文件之前,在文本编辑器中打开 package.json。除了 dependencies 块中列出的运行时模块之外,您还可以看到 devDependencies(开发人员依赖项 的缩写)块中列出的多个构建时依赖项。具体地讲,这个代码块就是在您键入 npm install 时,声明和安装与 Mocha 和 Karma 关联的 Grunt 插件的地方:
1
2
3
4
5
6
7
8
| "devDependencies": {
"grunt-env": "~0.4.1",
"grunt-mocha-test": "~0.10.0",
"grunt-karma": "~0.8.2",
"load-grunt-tasks": "~0.4.0",
// snip
}
|
|