单元测试 Nest JS 过滤器 Catch 方法

use*_*702 6 unit-testing node.js typescript jestjs

我想为具有 Catch 方法的 Nest JS Filter 编写单元测试。如何传递/模拟发生异常时传递的参数。如何断言 logger.error 被调用。

Jest用于单元测试

这是捕获所有异常的 Nest JS Filter 代码。


@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,
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

我现有的单元测试代码如下所示,需要在 catch 方法上编写测试。

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();
    });
});

Run Code Online (Sandbox Code Playgroud)

单元测试的测试覆盖率应为100%。

Pet*_*kin -1

您可以在测试所有服务、控制器等时测试过滤器的 catch 方法。无需模拟整个 catch 流程,因为它位于 Nest.js 部分。你的测试将如下所示

import { ConfigModule } from '@nestjs/config';
import { Test, TestingModule } from '@nestjs/testing';
import configuration from '../config';
import { IneligibleExceptionFilter } from './ineligible.filter';

describe('IneligibleExceptionFilter', () => {
  let service: IneligibleExceptionFilter;

  beforeEach(async () => {
    const module: TestingModule = await Test.createTestingModule({
      imports: [ConfigModule.forRoot({ isGlobal: true, load: [configuration] })],
      providers: [IneligibleExceptionFilter],
    }).compile();

    service = module.get<IneligibleExceptionFilter>(IneligibleExceptionFilter);
  });

  it('should be defined', () => {
    expect(service).toBeDefined();
  });

  describe('catch', () => {
    it('my test1', () => {
      // some logic here
    });
  });
});

Run Code Online (Sandbox Code Playgroud)