Когда вы издеваетесь над подключением к базе данных, вам нужно посмотреть, что возвращают ваши фиктивные функции. После проведенного вами теста обновлений, давайте go пройдем этот шаг за шагом:
const newUser = await userService.add({name: testUser1});
В соответствии с вашим сервисным кодом, userService.add
запускает userRepostiory.create()
и userRepository.save()
. save
- это всего лишь метод с заглушкой, поэтому давайте посмотрим на create
. Поскольку мы предоставляем макет, мы посмотрим, что макет возвращает
create: jest.fn().mockReturnValue(testUser)
Так что теперь мы знаем, что каждый раз, когда мы называем userRepostiory.create()
, testUser
будет возвращено. Теперь
const newUser = testUser
по сути является заменой кода. Двигаясь дальше, мы получаем подделку updateUserName
, которую мы генерируем, за которой довольно легко следить. Затем мы запускаем наш userService.edit()
, поэтому давайте посмотрим на это
async edit(user_id: string, data: Partial<UserDTO>): Promise<User> {
await this.userRepository.update({ user_id }, data);
return this.userRepository.findOne({ user_id });
}
Итак, сначала мы запускаем userRepository.update()
, а затем userRepository.findOne()
и, пока мы все еще дразнимся userRepository
, давайте посмотрим на эти насмешки. В частности, findOne
, поскольку мы ничего не делаем с возвращаемым значением update
.
update: jest.fn().mockResolvedValue(testUser)
Так что update
также возвращает testUser
. Теперь, если мы заменим наш тестовый код на фиктивную подстановку:
const updateUser = await Promise.resolve(testUser)
или, проще,
const updateUser = testUser
Ваше утверждение тогда будет
expect(udpateUser).not.toBe(newUser)
, и с подстановкой мы есть
expect(testUser).not.toBe(testUser)
И вот, есть проблема. Поскольку макеты create()
и findOne()
возвращают одно и то же значение и один и тот же объект, ваш пользователь всегда будет одинаковым до и после обновления! Чтобы обойти это, одну вещь, которую вы можете сделать, это смоделировать функцию, чтобы иметь одноразовое значение разрешения, которое отличается, например, так:
const findSpy = jest.spyOn(userRepo, 'findOne').mockResolvedValueOnce(someUpdatedUser)
Для этого вам потребуется получить ссылку на ваш UserRepository
просто как и вы за UserService
, но в остальном дайте вам свободу сделать утверждение, которое вы ожидаете.