Dante Reinhardt
Dante Reinhardt

Reputation: 31

How to mock a @Header request for NestJS unit testing

I am attempting to implement unit testing in NestJS. However, I am new to both NestJS and unit testing in general. So, what I need to do is to pass a test that gets all projects from a gitlab profile.

@Get()
getProjects(@Headers() headers: any): Observable<Project[]> {
if (!headers.token) {
  throw new HttpException('Missing User Token', HttpStatus.BAD_REQUEST);
 }
 return this.projectsService.listProjects(headers.token);
}

This is the code in the project.controller.ts file. It works well, and returns an observable with the list of projects. However, it requires a header to be sent through the HTTP request(Which is received using the @Headers decorator), as the gitlab is locked behind an authentication that requires a token to be passed through the header of the request.

I have attempted to mock the header to no success, and I was wondering if anyone has any idea how to proceed with the unit testing for that get request.

Upvotes: 1

Views: 3544

Answers (1)

Jay McDoniel
Jay McDoniel

Reputation: 70450

You don't need anything special here. In your unit test, you just need to pass an object with a token property to your method call.

describe('SomeController', () => {
  let controller: SomeController;
  let service: jest.Mocked<SomeService>;

  beforeAll(async () => {
    const modRef = await Test.createTestingModule({
      controllers: [SomeController],
      providers: [{
        provide: SomeService,
        useValue: {
          method: jest.fn(() => of('value'))
        }
      }]
    }).compile();
    controller = modRef.get(SomeController)
    service = modRef.get<jest.Mocked<SomeService>>(SomeService)
  });

  it('getProjects', (done) => {
    controller.getProejcts({ token: 'hey look! a token'}).subscribe({
      next: (val) => expect(val).toBe('value'),
      error: (err) => { throw err; }
      complete: () => done()
    });
  });
})

Upvotes: 1

Related Questions