【问题标题】:how to mock typeorm merge function with jest如何用 jest 模拟 typeorm 合并功能
【发布时间】:2021-11-01 11:20:18
【问题描述】:

我无法通过以下测试来更新用户信息
我正在使用nestjs btw 和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);
    });

users.repository.ts

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

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());
  }
}

【问题讨论】:

  • this.usersRepository 是从哪里来的?提供最小、完整的示例
  • 抱歉现在更新了,当您从 typeorm 的存储库扩展时,您可以访问多种方法,例如保存、合并等...

标签: typescript testing jestjs typeorm


【解决方案1】:

好的,所以我设法找到了解决方案,merge mockImplementation 不应该返回我错误的对象,而是更新用户对象属性就足够了。

        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);
        });

【讨论】:

    猜你喜欢
    • 2019-09-18
    • 2019-08-28
    • 2019-07-16
    • 2018-01-18
    • 2021-05-10
    • 2019-01-20
    • 2020-09-22
    • 2019-02-27
    • 1970-01-01
    相关资源
    最近更新 更多