Rumah >hujung hadapan web >tutorial js >Menguji Aplikasi GraphQL dengan Jest dan SuperTest

Menguji Aplikasi GraphQL dengan Jest dan SuperTest

Linda Hamilton
Linda Hamiltonasal
2025-01-14 07:31:441057semak imbas

Testing a GraphQL Application with Jest and SuperTest

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.

Cabaran: Mensimulasikan Tajuk dalam 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.

Penyelesaian: Menemui SuperTest

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.

Menyediakan Persekitaran Ujian

Sebelum terjun ke dalam ujian, mari kita sediakan persekitaran.

  1. Pasang Ketergantungan Mula-mula, pastikan anda memasang Jest, SuperTest dan Faker:
   npm install --save-dev jest supertest faker
  1. Konfigurasikan Jest Buat fail jest.config.js:
   module.exports = {
     preset: 'ts-jest',
     testEnvironment: 'node',
   };
  1. Tulis Kes Ujian Dengan persekitaran sedia, kami kini boleh menulis kes ujian.

Ujian Menulis dengan SuperTest

SuperTest menjadi pengubah permainan dalam senario ini. Begini cara saya menggunakannya untuk menguji operasi dan pengesahan CRUD API.

Menguji Operasi CRUD dengan SuperTest

  1. Penyediaan dan Pembongkaran Gunakan cangkuk Jest beforeAll dan afterAll untuk persediaan dan teardown:
   import { connect, disconnectDatabase } from './mongooseConnection';
   import supertest from 'supertest';
   import app from './../index';

   beforeAll(async () => {
     await connect();
   });

   afterAll(async () => {
     await disconnectDatabase();
   });
  1. Pengesahan Ujian dan Penggunaan Token Cipta fungsi pembantu untuk mendaftarkan pengguna dan dapatkan token:
   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;
   }
  1. Tugas Menguji Operasi CRUD

    • Buat Tugasan Baharu
     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);
     });
    

Menjalankan Ujian

Jalankan ujian anda menggunakan Jest:

npm test

Arahan ini akan melaksanakan semua fail ujian, menyediakan laporan terperinci keputusan.

Kesimpulan

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel sebelumnya:Memahami Skop dalam JavaScriptArtikel seterusnya:Memahami Skop dalam JavaScript