Dalam catatan blog ini, kami akan meneroka cabaran dan penyelesaian yang terlibat dalam menguji API GraphQL menggunakan Jest dan SuperTest. Perjalanan bermula dengan keperluan untuk mensimulasikan pengepala, khususnya untuk pengesahan berasaskan token, dalam ujian Jest.
Semasa membangunkan projek Todo Backend GraphQL untuk cabaran Woovi, saya menghadapi sekatan jalan yang ketara. Saya perlu menguji pengesahan API GraphQL, yang bergantung pada Token Web JSON (JWT) yang diluluskan dalam pengepala HTTP. Pada mulanya, saya bergelut untuk mencari cara yang mudah untuk mensimulasikan pengepala ini dalam Jest. Persediaan Jest standard tidak mencukupi kerana ia tidak mengendalikan permintaan dan respons HTTP secara langsung dengan cara yang sama seperti pelayan sebenar.
Selepas beberapa percubaan dan kesilapan, saya menemui SuperTest, sebuah perpustakaan yang direka untuk penegasan HTTP. SuperTest memanjangkan fungsi Jest dengan membenarkan anda menguji pelayan HTTP seolah-olah ia adalah pelanggan sebenar. Keupayaan ini memungkinkan untuk mensimulasikan pengepala, termasuk token kebenaran yang diperlukan untuk pengesahan API saya.
Sebelum terjun ke dalam ujian, mari kita sediakan persekitaran.
npm install --save-dev jest supertest faker
module.exports = { preset: 'ts-jest', testEnvironment: 'node', };
SuperTest menjadi pengubah permainan dalam senario ini. Begini cara saya menggunakannya untuk menguji operasi dan pengesahan CRUD API.
import { connect, disconnectDatabase } from './mongooseConnection'; import supertest from 'supertest'; import app from './../index'; beforeAll(async () => { await connect(); }); afterAll(async () => { await disconnectDatabase(); });
import { faker } from '@faker-js/faker'; import { graphql } from 'graphql'; import { schema } from '../schema'; async function authUserTest() { const userTest = { name: faker.name.firstName(), email: faker.internet.email(), password: faker.internet.password(), }; const source = ` mutation { register(name: "${userTest.name}", email: "${userTest.email}", password: "${userTest.password}") { token user { name email } } } `; const result = await graphql({ schema, source }); const data = result.data?.register; return data.token; }
Tugas Menguji Operasi CRUD
it('should create a new task', async () => { const todo = { task: faker.lorem.words(), status: faker.helpers.arrayElement(['pending', 'complete', 'in progress']), }; const query = ` mutation { todo(task: "${todo.task}", status: "${todo.status}") { task status } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.todo).toMatchObject(todo); });
Dapatkan Semua Tugas
it('should retrieve all tasks', async () => { const query = ` query { todos { _id task status } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.todos).toBeInstanceOf(Array); });
Kemas kini Tugas
it('should update a task', async () => { const todos = await Todo.find(); const randomTodo = todos[Math.floor(Math.random() * todos.length)]; const updatedTask = faker.lorem.words(); const updatedStatus = faker.helpers.arrayElement(['pending', 'complete', 'in progress']); const query = ` mutation { updateTodo(_id: "${randomTodo._id}", task: "${updatedTask}", status: "${updatedStatus}") { task status } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.updateTodo.task).toBe(updatedTask); expect(body.data.updateTodo.status).toBe(updatedStatus); });
Padamkan Tugasan
it('should delete a task', async () => { const todos = await Todo.find(); const randomTodo = todos[Math.floor(Math.random() * todos.length)]; const query = ` mutation { deleteTodo(_id: "${randomTodo._id}") { _id } } `; const { body } = await supertest(app) .post('/graphql') .send({ query }) .set('Accept', 'application/json') .set('Authorization', `Bearer ${await authUserTest()}`); expect(body.data.deleteTodo._id).toBe(randomTodo._id); });
Jalankan ujian anda menggunakan Jest:
npm test
Arahan ini akan melaksanakan semua fail ujian, menyediakan laporan terperinci keputusan.
Kesukaran dalam mensimulasikan pengepala dalam Jest membawa kepada penemuan SuperTest, yang telah memudahkan proses dengan ketara. Dengan memanfaatkan SuperTest bersama Jest, saya dapat menguji dengan berkesan pengesahan API GraphQL dan operasi CRUD, memastikan keselamatan dan kefungsian aplikasi. Berkongsi proses pembelajaran ini menyerlahkan kuasa pembelajaran awam dan penyelesaian masalah yang dipacu komuniti.
Atas ialah kandungan terperinci Menguji Aplikasi GraphQL dengan Jest dan SuperTest. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!