Наблюдаемый модульный тест пройден, когда он должен провалиться
Новичок в rxjs и angular, пытающийся написать некоторые базовые модульные тесты для простого rxjs, наблюдаемого со сценарием успеха / ошибки:
Метод обслуживания:
export class MyService {
constructor(private http: HttpClient) {}
public getId(id) {
return this.http.get('www.myurl.com/' + id, {
withCredential: true,
responseType: 'json' as 'json'
})
.pipe(
map(response => {
return response;
}),
catchError(() => {
return 'Service returned error';
})
};
}
}
Тестовое задание:
it('should throw an error',() => {
spyOn(httpClientMock, 'get').and.returnValue(Observable.throw('error));
myService.getId('test1')
.subscribe(
() => {},
error => {
expect(error).toEqual('Service returned error');
}
};
});
Тем не менее, вышеизложенное проходит, если я изменяю оператор ожидания на:
expect(error).toEqual('Service returned erro');
Юнит тест еще проходит.
Если я выйду из системы, я увижу:
S
e
r
v
i
c
e
r
e
t
u
r
n
e
d
e
r
r
o
r
1 ответ
Кажется, проблема в том, что catchError
ожидает, что наблюдаемый объект будет возвращен из обратного вызова fn, а не просто значение. Пытаться
import { of } from 'rxjs';
// ...
catchError(() => {
return of('Service returned error');
})
посмотрите пример этого здесь https://observable-playground.github.io/gist/aa4e24897f4fce150dd92a6fdb0f5929
ОБНОВИТЬ
Я только что понял, что вашей главной заботой может быть особенно прохождение теста. Тогда проблема, вероятно, в асинхронном характере наблюдаемых. В вашем тесте должен быть обратный вызов, чтобы указать, что тест асинхронный, и вызвать обратный вызов, чтобы отметить завершение выполнения.
Например:
it('should throw an error',(done) => {
spyOn(httpClientMock, 'get').and.returnValue(Observable.throw('error));
myService.getId('test1')
.subscribe(
() => {},
error => {
expect(error).toEqual('Service returned error');
},
// We will call done when Observable completes
() => done()
};
});
Вот статья о Жасмин и асинхронных звонках:
https://medium.com/dailyjs/unit-testing-async-calls-and-promises-with-jasmine-a20a5d7f051e