4

次のような高速アプリがあります。

サーバー.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 ファイルは third_party_api を再度必要とするファイルであるため、これは機能しません。


コントローラーをテストするには、次のようなことができます。

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


postsController.index(req, res)

この 2 番目の戦略は適切ではありません。スタブを作成する必要がreqあり、実際のインスタンスresをバイパスしているためです。app

proxyquire などを使用してこれを行う簡単な方法はありますか?

4

1 に答える 1