I would like to write unit test for Nest JS Filter that has Catch Method. How do I pass/mock the parameter that is passed when exception happen. How to assert the logger.error is called.
Jest is used for unit test
This is the Nest JS Filter code that capture all exception.
@Catch()
export class AllExceptionsFilter implements ExceptionFilter {
constructor(private logger: AppLoggerService) {}
catch(exception: any, host: ArgumentsHost) {
const ctx = host.switchToHttp();
const response = ctx.getResponse();
const request = ctx.getRequest();
const message = {
Title: exception.name,
Type: 'Error',
Detail: exception.message,
Status: 'Status',
Extension: '',
};
this.logger.error(message, '');
const status =
exception instanceof HttpException
? exception.getStatus()
: HttpStatus.INTERNAL_SERVER_ERROR;
response.status(status).send({
statusCode: status,
timestamp: new Date().toISOString(),
path: request.url,
});
}
}
My existing Unit test code is given below and need to write test on catch method.
describe('AllExceptionsFilter', () => {
let allExceptionsFilter: AllExceptionsFilter;
let appLoggerService: AppLoggerService;
beforeEach(async () => {
const loggerOptions = { appPath: process.cwd() }
const module: TestingModule = await Test.createTestingModule({
providers: [AllExceptionsFilter,
{
provide: AppLoggerService,
useValue: new AppLoggerService(loggerOptions, 'AllExceptionsFilter'),
},
],
}).compile();
allExceptionsFilter = module.get<AllExceptionsFilter>(AllExceptionsFilter);
});
it('should be defined', () => {
expect(allExceptionsFilter).toBeDefined();
});
});
Test coverage of unit test should be 100%.