Я пытаюсь выполнить модульное тестирование 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);