{
id: 1,
isAdmin: false,
username: 'testuser',
email: 'testuser@example.com',
password: 'password',
firstName: 'John',
lastName: 'Doe',
gender: Genders.MALE,
activationToken: null,
ativatedAt: new Date(),
createdAt: new Date(),
updatedAt: new Date(),
};
const userProfileMockFactory = () => userProfileMock;
const ctx = {
switchToHttp: () => ({
getRequest: () => ({
userProfile: userProfileMock,
}),
}),
};
const userProfileMockDecorator = UserProfile(
userProfileMockFactory,
ctx as ExecutionContext,
);
it('should return user by ID', async () => {
const result = await usersController.getUserById(
userProfileMockDecorator,
);
expect(result.username).toEqual(userProfileMock.username);
});
});
Парам декоратор не мокается.
У кого нибудь есть примеры хороших практик для подобного?
а как сам контроллер выглядит?
@Controller('users') export class UsersController { constructor(private tracksService: TracksService) {} @Public() @Get(':id') @UseInterceptors(ClassSerializerInterceptor) async getUserById(@UserProfile() userProfile: User): Promise<UserEntity> { return new UserEntity(userProfile); } Он просто возвращает то, что получил в декораторе. А выбирается юзер в миддваре
Так и кинь ему мок юзера в аргументах
ну да тут ничего и не остается. как только кинуть ему мок юзера и ожидать, что он отдаст UserEntity. @Public() @Get(':id/tracks') @UseInterceptors(TransformTrackInterceptor) async getUserTracks( @UserProfile() userProfile: User, @IsOwner() isOwner: boolean, ): Promise<Track[]> { const tracks: Track[] = await this.tracksService.getTracksByUser( userProfile, isOwner, ); return tracks; } Тут видимо тоже саму логику, что в зависимости от владельца отдаем те или иные треки нет смысла тестировать. А просто кинули юзера и isOwner получили некие треки. По крайней мере на уровне теста контроллера. Само по себе определение владельца в декораторах и миддварях мокать и тестировать пока не буду. Достаточно думаю интеграционного теста. @ApiOperation({ summary: 'Edit track info' }) @Put(':id/editInfo') @CheckPolicies(EditTrackHandler) @UseGuards(PoliciesGuard) @UseInterceptors(ClassSerializerInterceptor) async editInfo( @Body() editTrackInfoDto: EditTrackInfoDto, @Req() request: RequestWithTrack, ): Promise<TrackEntity> { const track: Track = request.track; const updatedTrack = await this.tracksService.editInfo( track, editTrackInfoDto, ); return new TrackEntity(updatedTrack); } Тут видимо тоже полиции, миддварии не мокаем. а просто даем в контроллер трек и дто и ждем ответа в виде отредактированного трека Верно понимаю?
Это зависит от того, что конкретно ты пытаешься протестить
Обсуждают сегодня