NestJS:Supertest e2e 测试跳过序列化程序拦截器

NestJS: Supertest e2e tests skip serializer interceptors

我正在使用超级测试测试 AuthenticationController。为此,我使用与我在主文件 main.ts:

中使用的配置相同的配置来模拟我的应用程序
// authentication.controller.ts

describe("The AuthenticationController", () => {
    let app: INestApplication;

    beforeEach(async () => {
        userData = {
            ...mockedUser,
        };

        const userRepository = {
            create: jest.fn().mockResolvedValue(userData),
            save: jest.fn().mockReturnValue(Promise.resolve()),
        };

        const module = await Test.createTestingModule({
            controllers: [...],
            providers: [...],
        }).compile();

        app = module.createNestApplication();
        app.useGlobalPipes(new ValidationPipe());
        app.useGlobalInterceptors(new ClassSerializerInterceptor(app.get(Reflector)));
        await app.init();
    });
});

这主要是有效的,但是每当我测试一个不应该 return 密码或 ID 的控制器时 - 因为实体定义中的 @Exclude() 装饰器 - 测试仍然 return交给我。

在 Postman 上手动测试端点仍然运行良好。

有谁知道是什么导致了这个问题?

我刚刚在他们的官方 Discord 上得到了一位 NestJS 开发人员的回答:https://discord.com/invite/nestjs

事实证明错误是因为在我的 userRepository 中模拟 create 的 return 值时,我实际上是 returning 一个对象而不是一个实例一个class。因此,必须替换以下行:

const userRepository = {
    create: jest.fn().mockResolvedValue(userData),
    save: jest.fn().mockReturnValue(Promise.resolve()),
};

通过以下方式:

const userRepository = {
    create: jest.fn().mockResolvedValue(new User(userData)),
    save: jest.fn().mockReturnValue(Promise.resolve()),
};

通过简单地 returning 一个对象,不考虑装饰器,因此 class 实例必须 returned。