Aqui vou anotar algumas pequenas dicas que me ajudaram durante o desenvolvimento com NestJS e que talvez ajudem outras pessoas.

NestJS e o uso de mocks nas repostas de requisições

Muitas vezes durante o desenvolvimento de uma aplicação no NestJS temos que fazer mock de respostas do módulo HttpModule, basicamente esse módulo encapsula o axios para fazer requisições fazendo uso do tipo Observable e AxiosResponse para o retorno. Aqui é mais uma dica para os casos onde seja necessário mockar a resposta de uma requisição feita com esse módulo. Considerando o seguinte

  async testRequest(
    path: string,
    payload: URLSearchParams,
  ): Promise<AxiosResponse> {
    return firstValueFrom(
      this.httpService.post(
        path,
        payload,
      ),
    );
  }

Para que seja possível fazer o mock de “httpService.post” é necessário que retornemos um Observable<AxiosResponse>, uma forma bastante simples de fazer isso é com o uso do método “of()” do pacote ‘rxjs’ passando para ele um objeto do tipo AxiosResponse. Desta forma teremos no teste algo como mostrado a seguir.

    it('should return request response', async () => {
      // Aqui temos a definição de uma resposta como sendo do tipo AxiosResponse
      const mockedResponse = {
        data: { status: 'approved' },
      } as AxiosResponse;

      // Aqui temos o uso da função 'of' do pacote rxjs para fazer o mock da resposta
      jest.spyOn(httpService, 'post').mockImplementation(() => {
        return of(mockedResponse);
      });

      const response = await twilioHttpService.twilioRequest(
        'path',
        new URLSearchParams(),
      );
      expect(response).toBe(mockedResponse);
    });

Módulos e undefined

Em alguns projetos que peguei tive que refazer a organização do projeto, fazendo uma pequena refatoração. Nesses casos costumo cair muito no problema de ler de algo nulo, como o mostrado a seguir.

TypeError: Cannot read properties of undefined (reading 'post')

E o processo para encontrar o erro as vezes é demorado. No meu caso especificamente durante as refatorações eu sempre esquecia de adicionar o

@Injectable()

e isso faz com que o NestJS não consiga fazer a injeção de dependência adequada das classes, ficando assim com o valor nulo. Fica aqui então o lembrete de sempre verificar se as novas classes criadas e que serão injetadas em outras estão precedidas do @Injectable(), talvez isso economize uns bons minutos de debug.