gpt4 book ai didi

angular - 如何使用注入(inject)的对象测试 Angular http 拦截器

转载 作者:太空狗 更新时间:2023-10-29 19:33:34 24 4
gpt4 key购买 nike

我正在尝试测试如果后端响应 419 状态代码(我们用它表示用户 session 已过期),我的拦截器是否将正确的操作分派(dispatch)给 ngrx 存储。

如果我手动尝试它是有效的 - 但我无法获得单元测试来验证这一点。从来没有给我的商店打电话。我假设我监视的商店不是注入(inject)拦截器的商店,或者我希望以某种方式提前调用?

到目前为止,这是我的代码:

fdescribe('Http Session Timeout Interceptor', () => {
let store: Store<AppState>;

beforeEach(() => {

TestBed.configureTestingModule({
imports: [HttpClientTestingModule, StoreModule.forRoot(appReducers)],
providers: [{
provide: HTTP_INTERCEPTORS,
useClass: HttpSessionTimeoutInterceptor,
multi: true
}]
});
store = TestBed.get(Store);
spyOn(store, 'dispatch');
});

it('interceptor is called',
inject([HttpClient, HttpTestingController], (http: HttpClient, httpMock: HttpTestingController) => {
http.get('/api').subscribe(response => {
const cast = response as HttpResponse<String>;
expect(cast.status).toBe(419);
});
const req = httpMock.expectOne('/api');
req.flush(<HttpResponse<String>>{status: 419});
httpMock.verify();
expect(store.dispatch).toHaveBeenCalledWith(new SessionTimeOutAction());
}));
});

这是拦截器,简单地检查响应状态并调度操作:

@Injectable()
export class HttpSessionTimeoutInterceptor implements HttpInterceptor {
constructor(private store: Store<AppState>) {}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req)
.catch(response => {
if (response.status === 419) {
this.store.dispatch(new SessionTimeOutAction());
}
return Observable.throw(response);
}) as any;
}
}

最佳答案

我认为您需要提供您的 Store<AppState>对你的供应商的依赖。不像 HTTP_INTERCEPTORS 这样的 JSON ,但就像您的 providers 数组中的普通条目一样。当然也删除顶部的声明。你可以想到TestBed作为测试的 NgModule。因此,为了找到要注入(inject)的依赖项,Angular 会扫描它以查找您需要的标记。不幸的是,如果您不这样做,您通常不会得到有用的错误。

关于angular - 如何使用注入(inject)的对象测试 Angular http 拦截器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48637948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com