Как я могу проверить, что на контроллере в Nest JS применяется защита? - PullRequest
1 голос
/ 16 января 2020

В Nest настроен контроллер JS, и я хочу проверить, установлены ли соответствующие защитные устройства - есть ли у кого-нибудь пример того, как это можно сделать?

Этот (сокращенный) пример правильно работает как приложение, поэтому я только после руководства по тестированию.

Вы заметите, что в пользовательском тесте есть тесты, где я звоню Reflect.getMetadata. Я стремлюсь к чему-то вроде этого - когда я проверяю его на метаданных __guards__, это функция, и я изо всех сил пытаюсь ее смоделировать, чтобы проверить, применяется ли она с AuthGuard('jwt') в качестве настройки.

User.controller.ts

@Controller('/api/user')
export class UserController {
  @UseGuards(AuthGuard('jwt'))
  @Get()
  user(@Request() req) {
    return req.user;
  }
}

User.controller.spe c .ts

describe('User Controller', () => {
  // beforeEach setup as per the cli generator

  describe('#user', () => {
    beforeEach(() => {
      // This is how I'm checking the @Get() decorator is applied correctly - I'm after something for __guards__
      expect(Reflect.getMetadata('path', controller.user)).toBe('/');
      expect(Reflect.getMetadata('method', controller.user)).toBe(RequestMethod.GET);
    });

    it('should return the user', () => {
      const req = {
        user: 'userObj',
      };

      expect(controller.user(req)).toBe(req.user);
    });
  });
});

1 Ответ

0 голосов
/ 16 января 2020

Для чего бы то ни было, вам не нужно проверять, что декораторы, предоставляемые фреймворком, тоже задают то, что вы ожидаете. Вот почему у фреймворка есть тесты на них для начала. Тем не менее, если вы хотите убедиться, что декоратор действительно устанавливает ожидаемые метаданные , вы можете увидеть, что здесь сделано .

Если вы просто хотите проверить защиту, вы можете создать экземпляр GuardClass напрямую и протестируйте его метод canActivate, предоставив объект ExecutionContext. У меня есть пример здесь . В этом примере используется библиотека, которая создает фиктивные объекты для вас, но идея в том, что вы создадите такой объект, как

const context = {
  switchToHttp: () => ({
    getRequest: jest.fn(),
    getResponse: jest.fn(),
  })
}

, где getRequest и getResponse возвращают объекты HTTP Request и Response ( или хотя бы частичные из них). Чтобы просто использовать этот объект, вам также нужно будет использовать as any, чтобы Typescript не жаловался слишком много.

...