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

Menguji Aplikasi GraphQL dengan Jest dan SuperTest

Linda Hamilton
Lepaskan: 2025-01-14 07:31:44
asal
994 orang telah melayarinya

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
Salin selepas log masuk
  1. Konfigurasikan Jest Buat fail jest.config.js:
   module.exports = {
     preset: 'ts-jest',
     testEnvironment: 'node',
   };
Salin selepas log masuk
  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();
   });
Salin selepas log masuk
  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;
   }
Salin selepas log masuk
  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);
     });
    
    Salin selepas log masuk
  • 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);
     });
    
    Salin selepas log masuk
  • 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);
     });
    
    Salin selepas log masuk
  • 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);
     });
    
    Salin selepas log masuk

Menjalankan Ujian

Jalankan ujian anda menggunakan Jest:

npm test
Salin selepas log masuk

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!

sumber:dev.to
Kenyataan Laman Web ini
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 terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan