我试图了解如何测试observation$
是否像_observations
一样更新。
//This is the function I want to test
public createNewOdour(odour: OdourCreateForm): Observable<ObservationRes> {
return this.http
.post<ObservationRes>(
`${environment.BACKEND_BASE_URL}api/observations`,
{ ...odour },
{
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
withCredentials: true,
},
)
.pipe(
tap(({ data }) => {
this.observation$.next(data[0]);
const currObservations = this._observations.getValue();
this.updateObservations([...currObservations, data[0]]);
}),
);
}
个字符
我想检查observation$
主题是否更新了HTTP响应。我希望res.data[0]
与observationValue
相同,但什么也没发生。现在它等于null,测试仍然通过,当它不应该。
更新:
现在我订阅的服务主题,而不是嘲笑它。它的工作原理是,我订阅它之前调用的功能,更新它。任何更好的解决方案?
` it('createNewOdour() updates the observation$ Subject', () => {
httpMock.post.mockReturnValueOnce(
of({ status: 'success', data: [observationsMock[0]] }),
);
// Check if observation$ have the expected value
service.observation$.subscribe((observationValue) => {
expect(observationValue.id).toEqual(observationsMock[0].id);
});
service.createNewOdour(odourCreateFormMock).subscribe();
});`
型
1条答案
按热度按时间zbq4xfa01#
测试只是几行代码,但是订阅有点到处都是。在这样的测试设置中,订阅是否是异步的,或者Assert是否运行,通常并不明显。这就是为什么我不喜欢在测试中订阅,而是使用promise。而且在大多数情况下,它是一次性的,或者如果需要多个值,可以使用
toArray()
。所以我会这样写测试:
字符串
observation$
应该是一个BehaviorSubject,这样订阅的时间就不重要了。