Как исправить тест с ошибкой «app.address ()» mocha / chai на API NestJS? - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь проверить маршруты моего API с Мокко и Чай, но все, что я получаю, это "TypeError".

Вот мой файл main.ts:

import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';

export async function bootstrap(): Promise<any> {
  const app = await NestFactory.create(AppModule);
  const options = new DocumentBuilder()
    .setTitle('Cats example')
    .setDescription('The cats API description')
    .setVersion('1.0')
    .addTag('cats')
    .build();
  const document = SwaggerModule.createDocument(app, options);
  SwaggerModule.setup('api', app, document);

  return await app.listen(3000);
}
const appServer = bootstrap();
export default appServer;

Первоначальнофункция "начальной загрузки" ничего не возвращала, но я заставил ее вернуть app.listen, чтобы в конце экспортировать ее.

Вот мой тестовый файл:

import * as chai from 'chai';
import chaiHttp = require('chai-http');
import 'mocha';
import appServer from '../src/main';

chai.use(chaiHttp);

describe('first test', () => {
  it('should return hello world', async () => {
    const res = await chai.request(appServer).get('/notes');
    chai.expect(res.text).to.equal('hello');
  });
});

Вот чтоЯ получаю, когда бездельничает "испытание npm". Ошибка возникает в файле "node_modules / chai-http / lib / request.js".

Ошибка типа: app.address () не является функцией

Я пыталсяв console.log (приложение) в файле «request.js», и это то, что я получил

обещание {}

И я тоже пыталсяпрямо в main.ts

console.log(app.address())

Но Visual Code немедленно предупреждает меня об этой ошибке

Свойство 'address' не существует для типа 'INestApplication'.ts (2339)

Совместим ли NestFactory с Chai? Такое ощущение, что «приложение», которое я экспортирую в «main.ts», не соответствует потребностям Shai. Я в замешательстве.

Вот отредактированное принятое решение для правильной работы

import * as chai from 'chai';
import chaiHttp = require('chai-http');
import 'mocha';
import { AppModule } from '../src/app.module';
import { INestApplication } from '@nestjs/common';
import { Test } from '@nestjs/testing';

chai.use(chaiHttp);

describe('first test', () => {
  let app: INestApplication;

  beforeEach(async () => {
    const module = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();
    app = module.createNestApplication();
    await app.init();
  });

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

  it('should return hello world', async () => {
    const res = await chai.request(app.getHttpServer()).get('/notes');
    chai.expect(res.text).to.equal('hello');
  });

});

1 Ответ

0 голосов
/ 15 октября 2019

Судя по всему, chai-http ожидает приложение Express / Connect или необработанный HTTP-сервер Node. Вам, вероятно, понадобится chai.request, чтобы использовать app.getHttpServer(), чтобы получить базовый сервер, поскольку Nest - это действительно синтаксическая оболочка для Express / Fastify.


Edit

Поскольку SwaggerModule не требуется в контексте теста, я бы предложил следующее:

import * as chai from 'chai';
import chaiHttp = require('chai-http');
import 'mocha';
import { AppModule } from '../src/app.module';

describe('first test', () => {
  let app: INestApplication;

  beforeEach(async () => {
    const module = await test.createTestingModule({
      imports: [AppModule],
    }).compile();
    app = module.createNestApplication();
    await app.init();
  });

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

  it('should return hello world', async () => {
    const res = await chai.request(app.getHttpServer()).get('/notes');
    chai.expect(res.text).to.equal('hello');
  });

});

Отсюда, если вам нужно переопределить какие-либо службы, охранники, каналы, перехватчики,или фильтры, вы можете использовать соответствующий метод override*() перед связыванием с вызовом compile(). Этот метод очень похож на метод тестирования с supertest.

...