Я создаю модульные тесты для сервиса с использованием шариков.
Проверенный метод сервиса (я оставил только проблемный 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 }));