Skip to content

Tests

Technologien

Als Test-Frameworks kamen Mocha und Jest in Frage. Die Entscheidung fiel auf Jest, da es weiter verbreitet ist und die Teammitglieder damit mehr Erfahrung haben. Das Backend-Framework NestJS nutzt ebenfalls standardmäßig Jest. Für End-to-End Tests verwenden wir außerdem supertest.

Dokumentationen:

Konventionen

Unit Tests benutzen die Dateiendung .spec.ts und werden direkt im Verzeichnis der zu testenden Datei erstellt. End-to-End Tests werden im Ordner backend/test mit der Dateiendung .e2e-spec.ts angelegt.

Beispiel Unit Test

ts
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

describe('CatsController', () => {
  let catsController: CatsController;
  let catsService: CatsService;

  beforeEach(() => {
    catsService = new CatsService();
    catsController = new CatsController(catsService);
  });

  describe('findAll', () => {
    it('should return an array of cats', async () => {
      const result = ['test'];
      jest.spyOn(catsService, 'findAll').mockImplementation(() => result);

      expect(await catsController.findAll()).toBe(result);
    });
  });
});

Beispiel End-to-End Test

ts
import * as request from 'supertest';
import { Test } from '@nestjs/testing';
import { CatsModule } from '../../src/cats/cats.module';
import { CatsService } from '../../src/cats/cats.service';
import { INestApplication } from '@nestjs/common';

describe('Cats', () => {
  let app: INestApplication;
  let catsService = { findAll: () => ['test'] };

  beforeAll(async () => {
    const moduleRef = await Test.createTestingModule({
      imports: [CatsModule],
    })
      .overrideProvider(CatsService)
      .useValue(catsService)
      .compile();

    app = moduleRef.createNestApplication();
    await app.init();
  });

  it(`/GET cats`, () => {
    return request(app.getHttpServer()).get('/cats').expect(200).expect({
      data: catsService.findAll(),
    });
  });

  afterAll(async () => {
    await app.close();
  });
});