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。
我正在使用超级测试测试 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。