Opptatt Jobber
Opptatt Jobber

Reputation: 319

node.js mocha test request

I'm using mocha.js and supertest.js to test the requests of my json server on express.js. These are my imports:

request = require('supertest')
assert  = require('assert')  # Node assert
app     = require('../app')  # Vanilla express app

This is my request implementation in the express app:

app.get '/user/:id', (req, res) ->
  res.json {}

and this is my test:

describe 'GET /user/:id', ->
  it 'should return the user data if user found', (done) ->
  request(app)
    .get("/user/some_id")
    .end((err, res) ->
      assert.equal('test', 'test')
      done()
    )

This works, but if I change my request to:

app.get '/user/:id', (req, res) ->
  User.findById req.param('id'), (err, doc) ->
    res.json {}

the mocha test just times out. I'm guessing this has something to do with the fact that the find is async and the test doesn't wait for it to finish. How do I solve this?

Upvotes: 3

Views: 5965

Answers (2)

zemirco
zemirco

Reputation: 16395

Try to increase the timeout:

mocha --timeout 5000

The default is 2000 ms and might be too short. From the documentation.

Upvotes: 3

Opptatt Jobber
Opptatt Jobber

Reputation: 319

Switching to https://github.com/mikeal/request/ solved it. I'm now doing

This is my test now:

describe 'GET /user/:id', ->
  it 'should return the user data if user found', (done) ->
    request.get(
      'http://localhost:31000/user/500d365abb75e67d0c000006'  
      , (err, res, body) ->
        json = JSON.parse body
        assert.equal(res.statusCode, 200)
        assert.equal(json._id, '500d365abb75e67d0c000006')
        done()
    )

Everything is working as expected now, but I still want to know if it's possible to use supertest or vows for this.

Upvotes: 1

Related Questions