🐚

Nest.js + GraphQLでテストコードを書く

2021/05/15に公開

タイトルの通りですが、GraphQLのテストコードは多少前提知識が必要なので、記事にすることにしました。概ねこちらのOSSを参考にした内容ですので、具体的なコードはこちらを参考にしていただけるといいと思います。(かなりのstar数なので信頼性もあると思います)
https://github.com/jmcdo29/testing-nestjs/tree/master/apps/graphql-sample

【前提】GraphQLのリクエストについて

知っている方は飛ばしてください。
GrqphQLのリクエストはWebの通信である以上、当然HTTPリクエストを行うわけですが、REST APIがGET, POST, PATCH, DELETEなどを使い分けるのに対して、GraphQLでは基本的なクエリやmutationはすべてPOSTで行われます。
こちらのSample Playgroundで右上のCOPY CURLからcurlのHTTPリクエストを取得してみましょう。

curl 'http://snowtooth.moonhighway.com/' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-H 'Connection: keep-alive' \
-H 'DNT: 1' \
-H 'Origin: http://snowtooth.moonhighway.com' \
--data-binary '{"query":"# Write your query or mutation here\nquery {\n  Trail(id: \"river-run\") {\n    name\n    difficulty\n    accessedByLifts {\n      name\n      trailAccess{\n        name\n      }\n    }\n  }\n}"}' \
--compressed

このようにPOSTメソッドのdata内(--data-binary)にクエリを差し込んでいます。

Nest.jsのテストコード

Nest.jsのTestにはe2eテストとunitテストがありますが、今回はe2eテストについて書きます。構文自体はunitテストも同じなので、大丈夫です。

import { INestApplication } from '@nestjs/common';
import { Test, TestingModule } from '@nestjs/testing';
import * as request from 'supertest';

import { AppModule } from '@/app.module';

describe('e2eテスト', () => {
  let app: INestApplication;

 // テスト前の処理(Test用Appの作成)
  beforeEach(async () => {
    const moduleFixture: TestingModule = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });
  
  // 全テスト終了後の処理
  afterAll(async () => {
    await app.close();
  });
  
  // 個別のテスト
  it('レスポンスが', () => {
    res = request(app.getHttpServer())
      .post('/graphql')
      .send({
        query: '{"query":"# Write your query or mutation here\nquery {\n  Trail(id: \"river-run\") {\n    name\n    difficulty\n    accessedByLifts {\n      name\n      trailAccess{\n        name\n      }\n    }\n  }\n}"}',
      })
     expect(res).toBe(200)
     expect((res) => {
	expect(res.body.data.getCat).toEqual({
	  name: 'Terra',
	  age: 5,
	  breed: 'Siberian',
	  id: '2',
	  });
      });
  });
});

このように、POSTメソッドでクエリを送信しましよう。

Discussion