🐚
Nest.js + GraphQLでテストコードを書く
タイトルの通りですが、GraphQLのテストコードは多少前提知識が必要なので、記事にすることにしました。概ねこちらのOSSを参考にした内容ですので、具体的なコードはこちらを参考にしていただけるといいと思います。(かなりのstar数なので信頼性もあると思います)
【前提】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