Насмешливая дата. Теперь шутите, чтобы иметь королеву, вызванную в nestJs - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь выяснить, как смоделировать вызов Date.now с помощью jest в моем приложении js.

У меня есть метод репозитория, который мягко удаляет ресурс

async destroy(uuid: string): Promise<boolean> {
  await this.userRepository.update({ userUUID: uuid }, { deletedDate: Date.now() });
  return true;
}

для мягкого удаления, мы просто добавляем временную метку, когда его попросили удалить

После некоторых обсуждений здесь и на других сайтах я придумал этот тест.

  describe('destroy', () => {
    it('should delete a user schemas in the user data store', async () => {
      const getNow = () => Date.now();
      jest
        .spyOn(global.Date, 'now')
        .mockImplementationOnce(() =>
          Date.now().valueOf()
        );
      const targetResource = 'some-uuid';
      const result = await service.destroy(targetResource);
      expect(result).toBeTruthy();
      expect(userRepositoryMock.update).toHaveBeenCalledWith({ userUUID: targetResource }, { deletedDate: getNow() });
    });
  });

I Предполагается, что .spyOn (global.Date) дразнил всю глобальную функцию dat, но Date.now () в моем репозитории по-прежнему возвращает фактическую дату, а не mock.

Мой вопрос, есть ли способ предоставить фиктивное возвращаемое значение Date.now, вызываемого в репозитории из теста, или я должен просто DI внедрить DateProvider в класс репозитория, который я затем могу смоделировать из своего теста?

1 Ответ

0 голосов
/ 14 февраля 2020

jest.spyOn() должно работать. Например,

userService.ts:

import UserRepository from './userRepository';

class UserService {
  private userRepository: UserRepository;
  constructor(userRepository: UserRepository) {
    this.userRepository = userRepository;
  }
  public async destroy(uuid: string): Promise<boolean> {
    await this.userRepository.update({ userUUID: uuid }, { deletedDate: Date.now() });
    return true;
  }
}

export default UserService;

userRepository.ts:

class UserRepository {
  public async update(where, updater) {
    return 'real update';
  }
}

export default UserRepository;

userService.test.ts:

import UserService from './userService';

describe('60204284', () => {
  describe('#UserService', () => {
    describe('#destroy', () => {
      it('should soft delete user', async () => {
        const mUserRepository = { update: jest.fn() };
        const userService = new UserService(mUserRepository);
        jest.spyOn(Date, 'now').mockReturnValueOnce(1000);
        const actual = await userService.destroy('uuid-xxx');
        expect(actual).toBeTruthy();
        expect(mUserRepository.update).toBeCalledWith({ userUUID: 'uuid-xxx' }, { deletedDate: 1000 });
      });
    });
  });
});

Результаты модульных испытаний с 100% покрытие:

 PASS  stackoverflow/60204284/userService.test.ts
  60204284
    #UserService
      #destroy
        ✓ should soft delete user (9ms)

----------------|---------|----------|---------|---------|-------------------
File            | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------------|---------|----------|---------|---------|-------------------
All files       |     100 |      100 |     100 |     100 |                   
 userService.ts |     100 |      100 |     100 |     100 |                   
----------------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.572s, estimated 11s

исходный код: https://github.com/mrdulin/react-apollo-graphql-starter-kit/tree/master/stackoverflow/60204284

...