虽然停了很久,貌似已经慢慢的开始死猪不怕开水烫了。
AngularJS 据说原生就是为BDD而生的。嗯,测试框架跑起来。
- Client (unit): Jasmine + Karma (Angular default)
- Client (e2e): Jasmine + Protractor (Angular default)
- Server: Mocha/SuperTest/Should (Koa default)
新建文件夹,在文件夹下 npm init。 因为后台决定用Koa做练习,并且用 grunt 作辅助(后来还是放弃了,这玩意跑起来我的机器就不动了), 所以在 package.json 中配置:
<!-- lang: js -->
"engines": {
"node": ">=0.11.9"
},
"scripts": {
"start": "grunt start",
"test": "node --debug --harmony node_modules/grunt-cli/bin/grunt test"
}
为什么要拿Koa做后台呢,因为真的好烦回调,一串下去会崩溃的。比如原来的 Express 说:
<!-- lang: js -->
…creating request for fact (state)
Wrapping in logger (state)
And authenticating (state)
Calling service (state)
“THE FACT”
Attaching to state
Out of callback
reformatting response and out of callback
Out of callback
那用 ES6 的 *(){} 就可以拉平了。用那个 yield。话说 CSharp 里面也有这个。 不过我是只看过怎么用,之后在应用里面就一直没写过。然后看到 Koa 里面漫山遍野都是这个,好紧张。
这节的目的是用测试框架,Koa 的事情不扯那么多,先跑起来再说。
<!-- lang: js -->
"use strict";
var co = require("co");
var koa = require("koa");
var logger = require("koa-logger");
var route = require("koa-route");
var app = koa();
module.exports = app;
app.init = co(function * () {
app.use(logger());
app.use(route.get("/user/:id", getUser));
function * getUser(id) {
this.body = id;
};
app.server = app.listen(3000);
console.log("go -> http://localhost:3000");
});
if (!module.parent) {
app.init();
};
嗯,就这样。然后开始弄测试。赶时髦写个 GruntFile.js 。看起来应该是这样的:
<!-- lang: js -->
"use strict";
var fs = require("fs");
module.exports = function(grunt) {
// Load grunt tasks automatically
require('load-grunt-tasks')(grunt);
// Time how long tasks take. Can help when optimizing build times
require('time-grunt')(grunt);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
env: {
test: {
NODE_ENV: 'test'
}
},
// Watches files for changes and runs tasks based on the changed files
watch: {
gruntfile: {
files: ['gruntfile.js']
},
server: {
files: ['.nodemon'],
options: {
livereload: true
}
}
},
nodemon: {
dev: {
script: 'bootstrap.js',
options: {
nodeArgs: ['--debug', '--harmony'],
ignore: ['node_modules/**'],
callback: function(nodemon) {
fs.writeFileSync('.nodemon', 'started');
nodemon.on('log', function(event) {
console.log(event.colour);
});
nodemon.on('restart', function() {
setTimeout(function() {
fs.writeFileSync('.nodemon', 'restarted');
}, 250);
});
}
}
}
},
concurrent: {
tasks: ['nodemon', 'watch'],
options: {
logConcurrentOutput: true
}
},
// Test
mochaTest: {
server: {
src: ["test/server/**/*.js"]
}
}
});
grunt.registerTask("start", ["concurrent"]);
grunt.registerTask("test", ["env:test", "mochaTest:server"]);
};
怎么看怎么觉得丑。真的觉得写这个配置文件好丑,jb 快出个 ide 把它灭了。话说里面有很多用不到的,也别那么纠结了,差不多回去再研究下。然后在控制台写 npm test 就执行 mochaTest:server 咯。当然,现在还是空的,会顺利通过。往 test/server/文件夹下面写测试代码。我们来看看测试代码。在 server 目录下面,因为用到 mocha,有些通用配置需要做。于是先建一个:
mocha.conf.js: 在这里面启动和关闭服务器,要不然等下测试的时候找不到。
<!-- lang: js -->
"use strict";
var app = require("../../bootstrap");
var baseUrl = "http://localhost:3000";
var supertest = require("supertest");
var request = supertest(baseUrl);
exports.request = request;
beforeEach(function(done) {
app.init(done);
});
afterEach(function(done) {
app.server.close(done);
});
user.js: 这个是用户 Controller 的测试
<!-- lang: js -->
"use strict";
var mocha = require("./mocha.conf");
var request = mocha.request;
describe("User Controller", function() {
it("GET /user/:id", function(done) {
request.get("/user/111")
.expect(200, done);
});
});
然后在控制台欢乐的输出 npm test。总之就是输出
1 passing (860ms) Done, without erros.
无视我的速度吧,860ms 不是我愿意的。然后就结束了。