proxyしているエンドポイントのproxy先も含めてテストに組み込みたいときに少し悩んだのでメモ。
mswjs/msw: Seamless REST/GraphQL API mocking library for browser and Node.js.という、モックサーバーを簡単にコードレベルで書けるライブラリがあったので、これを使った。
{ onUnhandledRequest: 'bypass' }
の箇所は、console.warn
が発生するので、オプションを設定した。これはおそらく、mswがlistenからcloseまで全てのリクエストをインターセプトしているので、nest.jsへのリクエストも含めて、検知しているからだと思う。ここは、モックしなくて良いので、bypass
を設定して、そのまま実行してもらう。
import { rest } from 'msw' import { setupServer } from 'msw/node' const mockEndpoint = 'http://localhost:3100' // 被らないように const mockServer = setupServer( rest.get(`${mockEndpoint}/example`, (req, res, ctx) => { return res(ctx.status(200), ctx.json({ message: 'ok' })) }) ) beforeAll(async () => { // 👇 https://mswjs.io/docs/api/setup-server/listen#onunhandledrequest mockServer.listen({ onUnhandledRequest: 'bypass' }) }) afterAll(async () => { mockServer.close() }) describe('routes api/proxy', () => { it('response.status = 200 を返すこと', async () => { const response = await app.request .get('/api/proxy/example') // 👈 appは、省略しているが、nest.js expect(response.status).toBe(200) expect(response.body).toEqual({ message: 'ok' }) }) })