Angular/NGXS,无法根据失败的API请求测试操作
我在尝试为调用http请求的NGXS操作编写测试时遇到问题。我想添加一些测试,以防请求成功或失败 我的行动:Angular/NGXS,无法根据失败的API请求测试操作,angular,rxjs,jasmine,ngxs,Angular,Rxjs,Jasmine,Ngxs,我在尝试为调用http请求的NGXS操作编写测试时遇到问题。我想添加一些测试,以防请求成功或失败 我的行动: @Action(SearchChuckNorrisJokes) searchChuckNorrisJokes({ getState, setState }: StateContext<ChuckNorrisStateModel>, { searchString }: SearchChuckNorrisJokes) { // Handle loa
@Action(SearchChuckNorrisJokes)
searchChuckNorrisJokes({ getState, setState }: StateContext<ChuckNorrisStateModel>, { searchString }: SearchChuckNorrisJokes) {
// Handle loading
const state = getState();
return this.chuckNorrisService.fetchCustomChuckNorrisJokes(searchString).subscribe(
res => {
setState({
...state,
loading: false,
error: false,
chuckData: res['result'],
});
}, err => {
setState({
...state,
loading: false,
error: true,
});
return throwError(err);
}
);
我相信我在监视状态/服务,但由于我使用的是NGXS存储,因此它没有看到我的“我”模仿了响应
如果需要,我很乐意提供更多信息。在过去一天左右的时间里,我一直在努力解决这个问题,很惊讶没有更多关于测试NGXS失败API调用的信息…我同意Shadow的观点。一旦你通过管道发送服务呼叫并返回可观察到的消息,你模仿“FetchCustomChuckNorrisChakes”的模式应该适合你。我也不知道你为什么要在规范中使用ChuckNorrisState。我同意Shadow。一旦你通过管道发送服务呼叫并返回可观察到的消息,你模仿“FetchCustomChuckNorrisChakes”的模式应该适合你。我也不知道你为什么要在规范中使用ChuckNorrisState。谢谢大家,我需要用管道发送响应,而不是订阅响应。非常感谢。。更新代码,以防任何人卡住: 声明:
@Action(SearchChuckNorrisJokes)
searchChuckNorrisJokes({ getState, setState }: StateContext<ChuckNorrisStateModel>, { searchString }: SearchChuckNorrisJokes) {
// Handle loading
const state = getState();
return this.chuckNorrisService.fetchCustomChuckNorrisJokes(searchString).pipe(
tap(res => {
setState({
...state,
loading: false,
error: false,
chuckData: res['result'],
});
}),
catchError(err => {
setState({
...state,
loading: false,
error: true,
});
return of(err);
})
);
}
谢谢大家,我需要通过管道发送回复,而不是订阅。非常感谢。。更新代码,以防任何人卡住: 声明:
@Action(SearchChuckNorrisJokes)
searchChuckNorrisJokes({ getState, setState }: StateContext<ChuckNorrisStateModel>, { searchString }: SearchChuckNorrisJokes) {
// Handle loading
const state = getState();
return this.chuckNorrisService.fetchCustomChuckNorrisJokes(searchString).pipe(
tap(res => {
setState({
...state,
loading: false,
error: false,
chuckData: res['result'],
});
}),
catchError(err => {
setState({
...state,
loading: false,
error: true,
});
return of(err);
})
);
}
测试中的投掷者是什么?它返回什么?您的方法无效,您永远不应该在操作处理程序中订阅。您还返回了
Subscription
类的一个实例,而NGXS不知道如何处理它。测试中的throwerr
是什么?它返回什么?您的方法无效,您永远不应该在操作处理程序中订阅。您还返回了Subscription
类的一个实例,NGXS不知道如何处理它。
it('should toggle a failed API call', () => {
spyOn(apiService, 'fetchCustomChuckNorrisJokes').and.returnValue(throwError({}));
store.dispatch(new SearchChuckNorrisJokes(null));
store.selectOnce(state => state.chuckData).subscribe(data => {
expect(data.error).toBe(true);
});
});