【问题标题】:testing node express endpoint and stub 3rd party api call测试节点快速端点和存根 3rd 方 api 调用
【发布时间】:2016-11-18 01:44:37
【问题描述】:

我有一个这样的快递应用:

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)
      })
    }
  }
}

规范/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 文件是再次需要 third_party_api 的文件。


可以做这样的事情来测试控制器:

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


postsController.index(req, res)

第二个策略感觉不对,因为现在我必须存根 reqres,现在我绕过了实际的 app 实例。

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

【问题讨论】:

    标签: javascript node.js express supertest proxyquire


    【解决方案1】:

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

    文件post.js 导出一个函数,所以当posts_controller.js 需要() post.js 文件时,它会执行该函数并再次评估third_party_api 的require 并清除存根。

    这是此处描述的“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'); }
    }) 
    

    然后在加载时评估 post 控制器内部所需的 third_party_api 模块,并按预期缓存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-05
      • 2019-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-01
      • 1970-01-01
      相关资源
      最近更新 更多