Попытка проверить мое гнездо API с шуткой, возвращает неопределенное - PullRequest
3 голосов
/ 03 мая 2019

Я пытаюсь создать тест Jest с помощью инфраструктуры NestJs.

Проверка должна проверить контроллер и сервис, однако 1) Контроллер не определен и 2) Сервис не определен.

Вот код в моем home-cards.controller.spec.ts :

describe('HomeCardsController', () => {
    let homeCardsController: HomeCardsController;
    let homeCardsService: HomeCardsService;

    beforeEach(async () => {
        const module = await Test.createTestingModule({
            imports: [TypeOrmModule.forFeature([HomeCard])],
            controllers: [HomeCardsController],
            providers: [HomeCardsService]
        }).compile();

        homeCardsController = module.get<HomeCardsController>(HomeCardsController);
        homeCardsService = module.get<HomeCardsService>(HomeCardsService);
    });

    describe('findall', () => {
        it('should return an array of home cards', async () => {
            expect( await homeCardsController.findAll(1000)).toBeInstanceOf(Array);
        });
    });
});

ошибка:

Новая ошибка, когда контроллер запрашивает пользователя:

TypeError: Cannot read property 'clientId' of undefined

      17 |   async findAll(@Req() request): Promise<HomeCard[]> {
      18 |       const user: AuthUser = request.user;
    > 19 |       return await this.homeCardsService.findAll(user.clientId);
         |                                                       ^
      20 |   }
      21 | 
      22 |   @Get(":id")

Ответы [ 2 ]

0 голосов
/ 06 мая 2019

В этом случае:

expect( await homeCardsController.findAll(1000)).toBeInstanceOf(Array);

Вы поставили значение 1000 вместо запроса @Req, который должен быть следующим объектом:

const request = {
  user: {
    clientId: 1000
  }
}
expect( await homeCardsController.findAll(request)).toBeInstanceOf(Array);

Если вы хотите, вы можете смоделировать свой репозиторий следующим образом (синтаксис в скобках ниже HomeCardsService):

beforeEach(async () => {
  const module = await Test.createTestingModule({
    controllers: [HomeCardsController],
    providers: [
      HomeCardsService,
      {
        provide: getRepositoryToken(HomeCard),
        useValue: jest.fn(() => ({
        save: jest.fn().mockReturnThis(),
        createQueryBuilder: jest.fn(() => ({
          select: jest.fn().mockReturnThis(),
          where: jest.fn().mockReturnThis(),
          getOne: jest.fn().mockReturnValueOnce(someMockedValue),
        })),
        }))(),
      },
    ]
  }).compile();
0 голосов
/ 03 мая 2019

Вы должны смоделировать метод HomeCardsService, который вызывается для HomeCardsController

import { HomeCardService } from './home-cards.service.ts'; // your path to service
jest.mock('./home-cards.service.ts'); // your path to service

describe('HomeCardsController', () => {
    let homeCardsController: HomeCardsController;
    let homeCardsService: HomeCardsService;

    beforeEach(async () => {
        const module = await Test.createTestingModule({
            // imports: [TypeOrmModule.forFeature([HomeCard])], <- unit test don't need database, mock all
            controllers: [HomeCardsController],
            providers: [HomeCardsService]
        }).compile();

        homeCardsController = module.get<HomeCardsController>(HomeCardsController);
        homeCardsService = module.get<HomeCardsService>(HomeCardsService);
    });

    describe('findall', () => {
        it('should return an array of home cards', async () => {
            const result = []; // some result for mock method
            jest.spyOn(homeCardsService, 'findAll').mockImplementation(() => result);
            const request = {user: {clientId: 1000}}
            expect( await homeCardsController.findAll(request)).toBeInstanceOf(Array);
        });
    });
});
...