gpt4 book ai didi

javascript - 测试 Node 快速端点和 stub 第 3 方 api 调用

转载 作者:搜寻专家 更新时间:2023-10-31 23:20:29 25 4
gpt4 key购买 nike

我有一个这样的 express 应用:

服务器.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)
})
}
}
}

规范/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()。我通过将此行添加到 posts_controller_spec 来尝试使用 proxyquire:

proxyquire('../posts_controller', {third_party_api: {
get: () => { console.log('stubbed out get method'); }
})

这不起作用,因为 server.js 文件是再次需要 third_party_api 的文件。


可以做这样的事情来测试 Controller :

const postsController = proxyquire('../posts_controller', {third_party_api: {
get: () => { console.log('stubbed out get method'); }
})


postsController.index(req, res)

第二个策略感觉不对,因为现在我必须对 reqres 进行 stub ,现在我要绕过实际的 app实例。

有没有一种简单的方法可以做到这一点,使用 proxyquire 或其他方式?

最佳答案

我意识到发生了什么,proxyquire 实际上并没有搞砸这里。

文件 post.js 导出一个函数,所以当 posts_controller.js requires() post.js 文件时,它执行函数和 third_party_api 再次被评估, stub 被清除。

这是此处描述的“runtimeGlobal”场景:https://www.npmjs.com/package/proxyquire#globally-override-require-during-module-runtime

解决方案是修复 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'); }
})

然后在加载时评估后 Controller 内部所需的 third_party_api 模块,并按预期进行缓存。

关于javascript - 测试 Node 快速端点和 stub 第 3 方 api 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com