在Nest JS中模拟存储库

时间:2020-09-27 12:57:29

标签: nestjs typeorm

根据documentation,我们可以在测试模块中使用提供程序来提供我们仓库的模拟版本。我最终将这段代码用于测试:

describe('UserController', () => {
  let userController: UserController

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [UserController],
      providers: [
        UserService,
        {
          provide: getRepositoryToken(User),
          useValue: {
            //
            // Trying everything here
            getUsers: () => {
              return Promise.resolve(['user1', 'user2'])
            },
            find: () => {
              return Promise.resolve(['user1', 'user2'])
            },
            findAll: () => {
              return Promise.resolve(['user1', 'user2'])
            },
            //
          },
        },
      ],
    }).compile()

    userController = app.get<UserController>(UserController)
  })

  describe('root', () => {
    it('should return Users', () => {
      expect(userController.getUsers()).toEqual(['user1', 'user2'])
    })
  })
})

控制器/存储库非常简单:

@Controller()
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  async getUsers(): Promise<User[]> {
    return this.userService.findAll()
  }

  @Post()
  addNewUser(@Body() user: Partial<User>): Promise<number> {
    return this.userService.create(user)
  }
}
@Injectable()
export class UserService {
  constructor(
    @InjectRepository(User)
    private usersRepository: Repository<User>
  ) {}

  findAll(): Promise<User[]> {
    return this.usersRepository.find()
  }

  findOne(id: string): Promise<User> {
    return this.usersRepository.findOne(id)
  }

  async remove(id: string): Promise<void> {
    await this.usersRepository.delete(id)
  }

  async create(user: Partial<User>): Promise<number> {
    return (await this.usersRepository.save(user)).id
  }
}

运行测试时,userController.getUsers()返回一个空对象:

  ● UserController › root › should return Users

    expect(received).toEqual(expected) // deep equality

    Expected: ["user1", "user2"]
    Received: {}

      38 |   describe('root', () => {
      39 |     it('should return Users', () => {
    > 40 |       expect(userController.getUsers()).toEqual(['user1', 'user2'])
         |                                         ^
      41 |     })
      42 |   })
      43 | })

      at Object.<anonymous> (user/user.controller.spec.ts:40:41)

可能是什么问题?

1 个答案:

答案 0 :(得分:0)

问题很傻-getUsers返回了一个承诺,所以我不得不做这样的事情:

describe('root', () => {
    it('should return Users', async () => {
      const res = await userController.getUsers()
      expect(res).toEqual(['user1', 'user2'])
    })
  })