我如何testing我的快速应用程序与摩卡?

我刚刚添加了shouldjs和mocha到我的快速应用程序进行testing,但我想知道如何testing我的应用程序。 我想这样做:

app = require '../app' routes = require '../src/routes' describe 'routes', -> describe '#show_create_user_screen', -> it 'should be a function', -> routes.show_create_user_screen.should.be.a.function it 'should return something cool', -> routes.show_create_user_screen().should.be.an.object 

当然,这个testing套件中的最后一个testing只是告诉医生res.render函数(在show_create_user_screen中调用)是未定义的,可能是因为服务器没有运行,configuration尚未完成。 所以我想知道其他人是如何进行testing的?

好的,首先尽pipetesting你的路由代码是你可能想要或不想做的事情,但是一般来说,尝试把纯粹的JavaScript代码(类或函数)与有趣的业务逻辑分离开来,使用香草摩卡testing来testing。 一旦你实现了这个目标,如果你想真正testing你在mocha中configuration的路由,你需要传递mock req, res参数到你的中间件函数中来模拟express / connect和你的中间件之间的接口。

对于一个简单的情况,你可以用一个render函数来创build一个模拟res对象,看起来像这样。

 describe 'routes', -> describe '#show_create_user_screen', -> it 'should be a function', -> routes.show_create_user_screen.should.be.a.function it 'should return something cool', -> mockReq = null mockRes = render: (viewName) -> viewName.should.exist viewName.should.match /createuser/ routes.show_create_user_screen(mockReq, mockRes).should.be.an.object 

也仅仅FYI的中间件function不需要返回任何特定的值,这就是他们在req, res, next参数上应该关注的testing中所做的事情。

以下是您在评论中请求的一些JavaScript。

 describe('routes', function() { describe('#show_create_user_screen', function() { it('should be a function', function() { routes.show_create_user_screen.should.be.a["function"]; }); it('should return something cool', function() { var mockReq = null; var mockRes = { render: function(viewName) { viewName.should.exist; viewName.should.match(/createuser/); } }; routes.show_create_user_screen(mockReq, mockRes); }); }); }); 

在connect.jstesting套件中find了一个替代scheme

他们正在使用supertest来testing连接应用程序,而无需将服务器绑定到任何端口,也无需使用模型。

这里是连接的静态中间件testing套件摘录(使用摩卡作为testing跑步者和超级断言)

 var connect = require('connect'); var app = connect(); app.use(connect.static(staticDirPath)); describe('connect.static()', function(){ it('should serve static files', function(done){ app.request() .get('/todo.txt') .expect('contents', done); }) }); 

这也适用于快递应用程序

你可以尝试SuperTest,然后服务器启动和closures都照顾到:

 var request = require('supertest') , app = require('./anExpressServer').app , assert = require("assert"); describe('POST /', function(){ it('should fail bad img_uri', function(done){ request(app) .post('/') .send({ 'img_uri' : 'foobar' }) .expect(500) .end(function(err, res){ done(); }) }) }); 

摩卡配备之前,之前,之后,以及之后进行bddtesting。 在这种情况下,您应该在您的描述调用之前使用。

 describe 'routes' -> before (done) -> app.listen(3000) app.on('connection', done) 

我发现build立一个TestServer类作为helper和一个helper http客户端是最简单的,只需要向真实的http服务器发送真正的请求。 但是,有些情况下,你想嘲笑和存根这个东西。

 // Test file var http = require('the/below/code'); describe('my_controller', function() { var server; before(function() { var router = require('path/to/some/router'); server = http.server.create(router); server.start(); }); after(function() { server.stop(); }); describe("GET /foo", function() { it('returns something', function(done) { http.client.get('/foo', function(err, res) { // assertions done(); }); }); }); }); // Test helper file var express = require('express'); var http = require('http'); // These could be args passed into TestServer, or settings from somewhere. var TEST_HOST = 'localhost'; var TEST_PORT = 9876; function TestServer(args) { var self = this; var express = require('express'); self.router = args.router; self.server = express.createServer(); self.server.use(express.bodyParser()); self.server.use(self.router); } TestServer.prototype.start = function() { var self = this; if (self.server) { self.server.listen(TEST_PORT, TEST_HOST); } else { throw new Error('Server not found'); } }; TestServer.prototype.stop = function() { var self = this; self.server.close(); }; // you would likely want this in another file, and include similar // functions for post, put, delete, etc. function http_get(host, port, url, cb) { var options = { host: host, port: port, path: url, method: 'GET' }; var ret = false; var req = http.request(options, function(res) { var buffer = ''; res.on('data', function(data) { buffer += data; }); res.on('end',function(){ cb(null,buffer); }); }); req.end(); req.on('error', function(e) { if (!ret) { cb(e, null); } }); } var client = { get: function(url, cb) { http_get(TEST_HOST, TEST_PORT, url, cb); } }; var http = { server: { create: function(router) { return new TestServer({router: router}); } }, client: client }; module.exports = http;