2019独角兽企业重金招聘Python工程师标准>>>
虽然停了很久,貌似已经慢慢的开始死猪不怕开水烫了。
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 stateOut of callbackreformatting 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 automaticallyrequire('load-grunt-tasks')(grunt);// Time how long tasks take. Can help when optimizing build timesrequire('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 fileswatch: {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}},// TestmochaTest: {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 不是我愿意的。然后就结束了。