API модульного тестирования с супер-тестовой моделью мангуста с цепочкой функций - PullRequest
0 голосов
/ 10 ноября 2019

Я пытаюсь выполнить модульное тестирование API-интерфейса Node.js + Express REST. Это все очень стандартные вещи CRUD, а внутренняя библиотека базы данных называется MongoDB, которая вызывается из Mongoose. Пока что так стандартно ...

Я хочу использовать SuperTest для тестирования моих контроллеров / маршрутов API, поэтому, естественно, мне нужно остановить вызовы базы данных

Этовот где я борюсь, особенно с цепными вызовами, такими как .limit() и .skip() в результатах моего запроса.

Попытка заглушить функцию ограничения mongoose DocumentQuery с помощью sinon не работает, например,

const stubQuery = sinon.stub(mongoose.DocumentQuery, 'limit')
.callsFake(()=>{})

Приводит к ошибке Trying to stub property 'limit' of undefined

Я пытался использовать библиотеку sinon-mongoose, но не могу заставить ее работать в контексте моих вызовов API в SuperTest. Кажется, это только для запуска тестов на моделях напрямую, которые я не делаю

Мой тест выглядит следующим образом

const app = require('../server').app;

// stub out model.find()
const stubModelFind = sinon.stub(mongoose.Model, 'find').callsFake(() => {
  return [ { foo: "bar" /* fake documents */ } ]
})

describe('Thing API', () => {
  it('returns some things', (done) => {
    request(app)
      .get('/api/things')
      .expect(function(res) {
        expect(res.body).to.be.an.an('array')
        // Rest of my tests / validation checks here
      })
      .expect(200, done);
  });
})

Этот тест не проходит с this.model.find(...).limit is not a function в качестве моей службы (которыйслой в моем коде, который общается с БД через Mongoose), выглядит примерно так (где this.model - это экземпляр модели Mongoose)

  let items = await this.model.find(query)
  .limit(limit)
  .skip(skip);
...