使用mocha测试快速路由 - 无法在变量中存储请求

时间:2014-02-28 04:39:08

标签: node.js express routes mocha supertest

有人可以向我解释为什么会发生以下情况。

我有一个测试快速路线的代码:

request = require 'supertest'
express = require 'express'
app = express()
Authentication = require("#{specDir}/../apps/authentication/routes")
authenticate = new Authentication app

describe 'authentication routes', ->
  describe 'GET', ->
    describe '/', ->
      describe 'user not logged in', ->
        requested = request(app).get('/').set('Accept', 'application/json')

        describe 'application/json', ->
          it 'sends error mesage', (done) ->
            request(app).get('/').set('Accept', 'application/json').end (err, res) ->
              expect(res.body).to.have.deep.property 'error.message', 'you need to log in'
              done()

          it 'sends 401 status', (done) ->
            request(app).get('/').set('Accept', 'application/json').end (err, res) ->
              expect(res.statusCode).to.equal 401
              done()

此代码可以正常工作,测试通过。但是,如果我将此request(app).get('/').set('Accept', 'application/json')requested变量交换,则第一个测试将通过,第二个将超时。

为什么?

1 个答案:

答案 0 :(得分:1)

因为request对象只能结束一次。第一次使用requested.end(...方法等待结束时,requested最终结束。第二次,你永远等待(好吧,直到发生超时),因为requested 已经已经结束。

如果你想在多个测试中重复使用结果(这似乎是保存requested的意图),你可以这样做:

describe("user not logged in", function () {
    var res;

    before(function(done) {
        request(app).get('/').set('Accept', 'application/json').end(function (err, r) {
            if (err)
                throw err;
            res = r;
            done();
        });
    });

    // You can use `res` from here on...
});