Конечный пункт экспресс-тестирования узла и вызов API-интерфейса стороннего производителя
У меня есть экспресс-приложение, подобное этому:
server.js
const postsController = require('./controllers/posts_controller.js')
module.exports = app = express()
app.get('posts', postsController.index)
posts_controller.js
const post = require('./post')()
module.exports = {
index: (req, res) => {
post.getAll().then((posts) => {
res.status(200).send(posts)
}, (error) => {
res.status(400).send('text')
})
}
}
post.js
module.exports = () => {
const thirdPartyApi = require('third_party_api')
return {
get: () => {
// do some stuff
return thirdPartyApi.get().then((resp) => {
// do some more stuff
return Promise.resolve(resp)
})
}
}
}
SPEC / posts_controller_spec.js
const app = require('../server')
const request = require('supertest')
describe('GET /posts', () => {
it('should return a collection of posts', () => {
request(app)
.get('/posts')
.end((_err, resp) => {
expect(resp.status).toEqual(200)
})
})
})
Моя цель здесь состоит в том, чтобы заглушить thirdPartyApi.get()
, Я пробовал с proxyquire
добавив эту строку в posts_controller_spec:
proxyquire('../posts_controller', {third_party_api: {
get: () => { console.log('stubbed out get method'); }
})
Это не работает, потому что файл server.js - это файл, который снова требует третий_партийный_апс.
Я мог бы сделать что-то вроде этого, чтобы проверить контроллер:
const postsController = proxyquire('../posts_controller', {third_party_api: {
get: () => { console.log('stubbed out get method'); }
})
postsController.index(req, res)
Эта вторая стратегия не подходит, потому что теперь я должен заглушить req
а также res
и теперь я в обход фактического app
пример.
Есть ли простой способ сделать это с помощью proxyquire или иным образом?
1 ответ
Я понял, что происходит, прокси-сервер на самом деле не портит здесь.
файл post.js
экспортирует функцию, поэтому, когда posts_controller.js
Требуется () файл post.js, он выполняет функцию и требует для third_party_api
оценивается снова и заглушка уничтожается.
Это сценарий "runtimeGlobal", описанный здесь: https://www.npmjs.com/package/proxyquire
Решение состоит в том, чтобы исправить post.js
чтобы он не экспортировал функцию:
const thirdPartyApi = require('third_party_api')
return {
get: () => {
// do some stuff
return thirdPartyApi.get().then((resp) => {
// do some more stuff
return Promise.resolve(resp)
})
}
}
Теперь, пока это происходит до инициализации приложения,
proxyquire('../posts_controller', {third_party_api: {
get: () => { console.log('stubbed out get method'); }
})
Затем модуль Third_party_api, который требуется внутри почтового контроллера, оценивается во время загрузки и кэшируется, как и ожидалось.