Node.jstestingRESTful API(vows.js?)

我真的可以做一些关于testing我在node.js中创build的RESTful api的build议。 那里有很多框架,我不知所措。 我的testing知识一般不够好,这就是为什么我要写这些testing。 我已经尝试了vows.js这似乎很好,但我无法工作如何纳入我的API的testing,我需要某种客户端。 一个简单的post来testinglogin系统的例子是我需要去的。

6个月后更新

誓言是很糟糕的。 使用摩卡

原版的

更新与誓言是代码

这是誓言 – 是誓言的例子 – 示例文件夹 。

// simple HTTP // Run with node example/simple-http.js var express = require("express"); is = require("../src/vows-is.js"); is.config({ "server": { "factory": function _factory(cb) { var app = express.createServer(); app.get("/", function(req, res) { res.send("hello world"); }) app.listen(3000); cb(app); }, "uri": "http://localhost:3000", "kill": function _kill(app) { app.close(); } } }); is.suite("http request test").batch() .context("a request to GET /") .topic.is.a.request("GET /") .vow.it.should.have.status(200) .vow.it.should.have .header("content-type", "text/html; charset=utf-8") .context("contains a body that") .topic.is.property('body') .vow.it.should.be.ok .vow.it.should.include.string("hello world") .suite().run({ reporter: is.reporter }, function() { console.log("finished"); is.end(); }) 

这使用誓言 。

http://blog.nodejitsu.com/rest-easy-test-any-api-in-nodejs是为这个目的而devise的。 这是一种位于誓言之上的DSL,简化了用誓言写出testing的过程。

基本testing:

 // // Here we will configure our tests to use // http://localhost:8080 as the remote address // and to always send 'Content-Type': 'application/json' // suite.use('localhost', 8000) .setHeader('Content-Type', 'application/json'); // // A GET Request to /ping // should respond with 200 // should respond with { pong: true } // .get('/ping') .expect(200, { pong: true }) // // A POST Request to /ping // should respond with 200 // should respond with { dynamic_data: true } // .post('/ping', { dynamic_data: true }) .expect(200, { dynamic_data: true }) 

我已经使用了vowsjs和请求库。

我已经发现它们是最简单的,因为两个库都被正确地logging下来,并似乎被积极地开发和维护。 (我还没有findAPI的文档就足够了。)

下面是我正在写的testingCouchapp的HTTP API的示例testing :

 var request = require ('request') , vows = require ('vows') , assert = require ('assert'); var BASE_URL = "http://local.todos.com:5984/todos/" , HEADERS = { 'Content-Type': 'application/json' } , revisionReference; vows.describe ('CouchApp Todos REST API') // -------------------------------------------- // Testing PUTs // ============================================ .addBatch ({ "A PUT to /todos/test-host without data": { topic : function () { request ({ uri: BASE_URL + "test-host", method: 'PUT', headers: HEADERS }, this.callback ); } , "should respond with 201" : function ( err, res, body ) { assert.equal ( res.statusCode, 201 ); } , "should have an id 'test-host'" : function ( err, res, body ) { assert.equal ( JSON.parse( res.body )._id, 'test-host' ); } , "response should contain empty todos []" : function ( err, res, body ) { assert.include ( JSON.parse( res.body ), 'todos' ); assert.deepEqual ( JSON.parse( res.body ).todos, [] ); } } }) .addBatch ({ "A PUT to /todos/test-host with one todo item (an object)" : { topic : function () { request ({ uri: BASE_URL + "test-host" , body: JSON.stringify({ "title" : "Testing Todo", "isDone" : false }) , method : "PUT" , headers : HEADERS }, this.callback ); } , "should respond with 201" : function ( err, res, body ) { assert.equal ( res.statusCode, 201 ); } , "should have an id 'test-host'" : function ( err, res, body ) { assert.equal ( JSON.parse( res.body )._id, 'test-host' ) } , "response should contain todos array with one item" : function ( err, res, body ) { assert.include ( JSON.parse( res.body ), 'todos' ); assert.deepEqual ( JSON.parse( res.body ).todos , [{ "title" : "Testing Todo", "isDone" : false, "_id" : 0 }] ); } } })