Я вижу два случая для тестирования: когда statusCode === 1
и когда statusCode !== 1
.
. Для первого теста: макетируйте свой бэкэнд, чтобы он возвращал ответ как наблюдаемый объект со свойством StatusCode
, установите на 1.
Вы должны создать шпион жасмина для метода logout
из объекта auth
.
Затем подпишитесь на метод typegetall()
и зарегистрируйтесь в этой подписке, еслиlogout
был вызван.
Для второго теста: макетируйте ваш бэкэнд, чтобы он возвращал ответ как наблюдаемый объект со свойством StatusCode
, для которого установлено значение 2 И свойство StatusDescription
для массива alarm
, пока не создавать экземпляр Alarm.
Затем подпишитесь на typegetall()
с возвращаемыми данными (ваш массив Alarm).В этой подписке вы можете проверить длину и, для каждого элемента, если они являются экземпляром Alarm.
Проверьте официальную документацию по тестированию , чтобы узнать, как создать свой ложный ответ.
Для первого:
it('should call logout when statusCode is equal to 1', () =>
{
alarmService = TestBed.get(AlarmService);
authService = TestBed.get(AuthService);
/* Put your mock response here, an observable of object with StatusCode set to 1 */
spyOn(authService, 'logout');
alarmService.typegetall().subscribe(() => {
expect(authService.logout).toHaveBeenCalledTimes(1);
});
}
Для второго:
it('should return an array Alarm when statusCode is equal to 2', () =>
{
alarmService = TestBed.get(AlarmService);
authService = TestBed.get(AuthService);
/* Put your mock response here, an observable of object with StatusCode set to 2 and StatusDescription set to an array of 3 alarm object*/
spyOn(authService, 'logout');
alarmService.typegetall().subscribe((alarms: Alarm[]) => {
expect(authService.logout).not.toHaveBeenCalled;
expect(alarms.length).toBe(3);
alarms.forEach(alarm => expect(jasmine.any(alarm instanceof Alarm)).toBeTruthy());
/*
Other expectations to check object properties values, such as :
expect(alarms[0].aProperty).toBe(...);
*/
});
}
Для ошибки тестирования добавьте в свою службу оператор rxjs catchError
( learnбольше здесь ):
public typegetall(): Observable<Alarm[]> {
...
return this.http.get(Api.getUrl(Api.URLS.typegetall), {
headers: headers
})
.map((response: Response) => {
let res = response.json();
if (res.StatusCode === 1) {
this.auth.logout();
} else {
return res.StatusDescription.map(alarm => {
return new Alarm(alarm);
});
}
})
.catchError(error => of(`An error occured: ${error}`));
}
и протестируйте его следующим образом:
it('should get an error', () =>
{
alarmService = TestBed.get(AlarmService);
/* Create your mock response error here, an observable created with '_throw' and return a value (ex: 'shit, error !') */
alarmService.typegetall().subscribe(error => expect(error).toBe('shit, error !'));
}