как издеваться над функцией слияния typeorm с jest

#typescript #testing #jestjs #typeorm

Вопрос:

Я не могу выполнить следующий тест для обновления информации о пользователе
, которую я использую nestjs, кстати, и typeorm
Всякий раз, когда я регистрирую результат, свойства не обновляются

users.service.ts

 async update(id: string, updateUserDto: UpdateUserDto): Promise<User> {
    const user = await this.usersRepository.findOne(id);
    if (!user) throw new NotFoundException('user not found');
    this.usersRepository.merge(user, updateUserDto);
    await this.usersRepository.save(user);
    return user;
  }
 

users.service.spec.ts

 it('should update user with new information', async () => {
      const userPropertiesToUpdate = {
        firstName: 'peter',
      };
      const updateUserDto = plainToClass(UpdateUserDto, userPropertiesToUpdate);
      jest
        .spyOn(repository, 'findOne')
        .mockResolvedValue(plainToClass(User, UserMockFactory.build()));
      jest
        .spyOn(repository, 'merge')
        .mockImplementation((user, updateUserDto) => {
          return Object.assign({}, user, updateUserDto);
        });
      const result = await service.update(
        '3b06c85a-698b-4410-bd31-b8b2990eec3a',
        updateUserDto,
      );
      console.log(result);
    });
 

пользователи.репозиторий.ts

 @EntityRepository(User)
export class UsersRepository extends Repository<User> {}
 

пользователь-mock.factory.ts

 export class UserMockFactory {
  public id = '3b06c85a-698b-4410-bd31-b8b2990eec3a';
  public firstName = 'george';
  public lastName = 'michael';
  public email = 'george@email.com';
  public password = 'asd123';
  public createdAt = new Date();
  public roles = [Role.User];
  public resetToken = '';
  public address = {
    street: 'collins avenue',
    number: 403,
    city: 'miami',
    district: 'florida',
  };

  public static build() {
    return new UserMockFactory();
  }

  public static buildList(length: number) {
    return Array(length)
      .fill(0)
      .map(() => this.build());
  }
}
 

Комментарии:

1. Откуда же this.usersRepository это берется? Приведите минимальный, полный пример

2. извините обновлено сейчас, когда вы расширяетесь из репозитория typeorm, вы получаете доступ к нескольким методам, таким как сохранение, объединение и т. Д…

Ответ №1:

Итак, мне удалось найти решение, слияние макетной реализации не должно возвращать объект, который был моей ошибкой, вместо этого было достаточно просто обновить свойства пользовательского объекта.

         it('should update user with new information', async () => {
          jest
            .spyOn(repository, 'findOne')
            .mockResolvedValue(plainToClass(User, UserMockFactory.build()));
    
          jest
            .spyOn(repository, 'merge')
            .mockImplementation((user, updateUserDto) => {
              Object.assign(user, updateUserDto, {
                address: Object.assign(user.address, updateUserDto.address),
              });
              return null;
            });
    
          // Mock user dto object
          const updateUserDtoMock = plainToClass(UpdateUserDto, {
            id: UserMockFactory.build().id,
            firstName: 'peter',
            address: {
              name: 'victoria',
              number: 400,
            },
          });
    
          const user = await service.update(
            updateUserDtoMock.id,
            updateUserDtoMock,
          );
          console.log(user);
        });