2 minutos
NestJS e dicas nos testes
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.