Перемешанный с мрамором метод обслуживания не выделяет ценность - PullRequest
0 голосов
/ 27 апреля 2020

Я создаю модульные тесты для сервиса с использованием шариков.
Проверенный метод сервиса (я оставил только проблемный c фрагмент)

updatePayment(payment: Partial<Payment>, familyId: string): Observable<void> {
  return this.authenticationService.getUser()
}

Я создал сервисный макет

function getAuthenticationServiceSpy() {
   ...

  // tslint:disable-next-line: max-line-length
  const authenticationServiceSpy: jasmine.SpyObj<AuthenticationService> = jasmine.createSpyObj(
    'AuthenticationService', ['getUser']
  );
  authenticationServiceSpy.getUser.and.returnValue(hot('--a', { a: user }));

  return authenticationServiceSpy;
}

export interface IAuthenticationServiceMock {
  getService: () => jasmine.SpyObj<AuthenticationService>;
  user: User;
}

// tslint:disable-next-line: max-line-length
export const AuthenticationServiceMock: () => IAuthenticationServiceMock = () => ({
  getService: getAuthenticationServiceSpy,
  user
});

Я использую его в spe c для обслуживания

describe('PaymentsService', () => {
  let service: PaymentsService;
  let authenticationServiceSpy: jasmine.SpyObj<AuthenticationService>;
  let authenticationServiceMock: IAuthenticationServiceMock;

  const scheduler = new TestScheduler((actual, expected) => {
    expect(actual).toEqual(expected);
  });

  beforeEach(() => {
    authenticationServiceMock = AuthenticationServiceMock();
    authenticationServiceSpy = authenticationServiceMock.getService();

    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [
        { provide: AuthenticationService, useValue: authenticationServiceSpy }
      ]
    });
    service = TestBed.get(PaymentsService);
    httpTestingController = TestBed.get(HttpTestingController);
  });

  it('should do the thing', () => {
      const mockedFamilyId = 'familyId-1';
      const updatedPayment = {};
      service.updatePayment(updatedPayment, mockedFamilyId)
        .subscribe(payment => {
          expect(1).toBe(2); // should fail
        });
    }
  );
});

Проблема в том, что этот тест прошел успешно, чего не должно быть. Как я понимаю authenticationServiceSpy.getUser() не выделяет значение, но я не понимаю, почему. Значение выдается, если я изменяю

authenticationServiceSpy.getUser.and.returnValue(hot('--a', { a: user }));

на

authenticationServiceSpy.getUser.and.callFake(() => hot('--a', { a: user }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...