سؤال

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: " + from + ", 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!

هل كانت مفيدة؟

المحلول

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

نصائح أخرى

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']
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top