简体   繁体   中英

NestJS: Supertest e2e tests skip serializer interceptors

I'm testing an AuthenticationController using supertest. To do so, I am mocking my application using the same configuration than the one I use in my main file 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();
    });
});

This mostly works, but whenever I am testing a controller that should not return a password or an id for example - because of the @Exclude() decorator in an entity definition - the test still returns it to me.

Testing the endpoint manually on Postman still works well.

Does anyone know what could cause that issue?

I just got an answer from one of the developers of NestJS on their official Discord: https://discord.com/invite/nestjs

It turns out the error came from the fact that when mocking the return value of create in my userRepository, I was actually returning an object instead of an instance of a class. Therefore, the following lines had to be replaced:

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

By the following:

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

By simply returning an object, the decorators are not taken into account, so a class instance must be returned.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM