Использование Superagent/Supertest с приложением Express в тестах Mocha

Я пытаюсь написать тесты для REST API, который я разрабатываю, используя Mocha. Я обнаружил Superagent, который позволяет мне делать HTTP-запросы. Я использую приложение Express, которое я передаю в Superagent, но получаю странные ошибки о Mongoose при попытке запустить эти тесты с приложением Express, переданным таким образом. Вот мой код для тестов:

var
    // Node modules
    mongoose = require('mongoose')
  , async = require('async')
  , should = require('should')
  , request = require('superagent')

  , app = require('../../app_mocked')
  , Link = mongoose.model('Link')

request = request(app)

describe('Links resource', function () {

  var userId = '50dc81654dca01006b000005'
    , linkId
    , sampleLink = {
        'uri': 'http://test.com/',
        'meta': {
          'title': 'Test',
          'desc': 'Test link desc'
        },
        'shares': [{
          'uid': userId,
          'date': new Date(),
          'message': 'Test link message'
        }]
      }

  it('POST /api/users/:id/links', function (done) {
    request(app).post('/api/users/' + userId + '/links')
      .send(sampleLink)
      .end(function (err, res) {
        res.should.have.status(200)
        res.body.should.have.property('id')

        linkId = res.body.id

        done()
      })
  })

  it('GET /api/users/:id/links', function (done) {
    request(app).get('/api/users/50dc81654dca01006b000005/links')
      .end(function (err, res) {
        res.should.have.status(200)
        res.body.should.have.lengthOf(1)

        done()
      })
  })

})

Ошибка, которую я получаю, заключается в следующем:

1) Links resource POST /api/users/:id/links:
   TypeError: Cannot call method 'update' of null
    at MongoStore.MONGOSTORE.set (/Users/Oliver/Development/Personal/Reader/node_modules/connect-mongodb/lib/connect-mongodb.js:146:15)
    at Session.save (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/middleware/session/session.js:63:25)
    at ServerResponse.res.end (/Users/Oliver/Development/Personal/Reader/node_modules/express/node_modules/connect/lib/middleware/session.js:280:19)
    at ServerResponse.res.send (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:149:8)
    at ServerResponse.res.json (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:191:15)
    at ServerResponse.res.send (/Users/Oliver/Development/Personal/Reader/node_modules/express/lib/response.js:117:21)
    at Promise.exports.create (/Users/Oliver/Development/Personal/Reader/server/resources/links.js:29:9)

Однако эта ошибка появляется только иногда. 1/5 раза тесты пройдут без проблем. Это заставляет меня думать, что тесты иногда запускаются до полной загрузки app.

В качестве альтернативы, если я запускаю приложение в отдельном сеансе и просто передаю URL-адрес request, как показано ниже, тогда оно работает каждый раз:

request = request('http://localhost:3000')

Это причина почему? Если да, то как я могу запускать тесты только после полной загрузки app?


person Community    schedule 07.02.2013    source источник


Ответы (1)


Оказывается, мне пришлось указать тест before, чтобы дождаться открытия соединения MongoDB перед запуском тестов.

before(function (done) {
  mongoose.connection.on('open', done)
})
person Community    schedule 07.02.2013
comment
Я думаю, что для экспресс-сервера также рекомендуется не начинать прослушивание до тех пор, пока не будут установлены все соединения с базой данных. - person Alexander Mills; 20.11.2015