Node.js: How to test a function
How can I test a function like this?
app.post '/incoming', (req,res) ->
console.log "Hello, incoming call!"
message = req.body.Body
from = req.body.From
sys.log "From: " + fro开发者_Go百科m + ", Message: " + message
twiml = '<?xml version="1.0" encoding="UTF-8" ?>\n<Response>\n<Say>Thanks for your text, we\'ll be in touch.</Say>\n</Response>'
res.send twiml, {'Content-Type':'text/xml'}, 200
I haven't chosen any test framework yet. I don't understand how this can be tested.
thanks!
I prefer the lighter-weight syntax of nodeunit, combined with request for making HTTP requests. You'd create a test/test.coffee
file that looks something like
request = require 'request'
exports['Testing /incoming'] = (test) ->
request 'http://localhost:3000/incoming', (err, res, body) ->
test.ok !err
test.equals res.headers['content-type'], 'text/xml'
test.equals body, '<?xml version="1.0" encoding="UTF-8" ?>\n<Response>\n<Say>Thanks for your text, we\'ll be in touch.</Say>\n</Response>'
test.done()
and run it from another file (perhaps your Cakefile
) with
{reporters} = require 'nodeunit'
reporters.default.run ['test']
Testing is simple. You just create a unit test that starts your express server, makes a http POST and asserts that your HTTP post works and gets the correct output back.
Using vows-is. (Sorry, no coffeescript)
var is = require("vows-is"),
app = require("../src/app.js");
is.config({
"server": {
"factory": function _factory(cb) { cb(app); }
}
});
is.suite("http request test").batch()
.context("a request to POST /incoming")
// make a POST request
.topic.is.a.request({
"method": "POST",
"uri": "http://localhost:8080/incoming",
// set the request body (req.body)
"json": {
"Body": ...,
"From": ...
}
})
.vow.it.should.have.status(200)
.vow.it.should.have
.header("content-type", "text/xml")
.context("contains a body that")
.topic.is.property('body')
.vow.it.should.be.ok
.vow.it.should.include.string('<?xml version="1.0" encoding="UTF-8" ?>\n<Response>\n<Say>Thanks for your text, we\'ll be in touch.</Say>\n</Response>')
// run the test suite
.suite().run({
reporter: is.reporter
}, function() {
is.end();
});
Store this in a file http-test.js
in a folder test
. Then just run
$ npm install vows-is
$ node test/http-test.js
See an example of exporting your serverSetup function
精彩评论