gpt4 book ai didi

angular - 如何在测试中模拟 Angular 4.3 httpClient 的错误响应

转载 作者:太空狗 更新时间:2023-10-29 16:54:15 25 4
gpt4 key购买 nike

我有一个下面的拦截器auth-interceptor.service.ts

import {Injectable, Injector} from '@angular/core';
import {HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs/Observable';
import {Cookie} from './cookie.service';
import {Router} from '@angular/router';
import {UserService} from './user.service';
import {ToasterService} from '../toaster/toaster.service';
import 'rxjs/add/operator/catch';
import 'rxjs/add/observable/throw';

@Injectable()
export class AuthInterceptor implements HttpInterceptor {
constructor(private injector: Injector) {}

private handleError(err: HttpErrorResponse): Observable<any> {
let errorMsg;
if (err.error instanceof Error) {
// A client-side or network error occurred. Handle it accordingly.
errorMsg = `An error occurred: ${err.error.message}`;
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
errorMsg = `Backend returned code ${err.status}, body was: ${err.error}`;
}
if (err.status === 401 || err.status === 403) {
this.injector.get(UserService).purgeAuth();
this.injector.get(ToasterService).showError(`Unauthorized`, errorMsg);
this.injector.get(Router).navigateByUrl(`/login`);
}
console.error(errorMsg);
return Observable.throw(errorMsg);
}

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
// Clone the request to add the new header.
const authReq = req.clone({headers: req.headers.set(Cookie.tokenKey, Cookie.getToken())});
// Pass on the cloned request instead of the original request.
return next.handle(authReq).catch(err => this.handleError(err));
}
}

现在我正在尝试模拟 http.get 以抛出错误,以便该方法 handleError 控制错误消息。

下面是我对测试用例的处理auth-interceptor.service.specs.ts

import {async, inject, TestBed} from '@angular/core/testing';

import {AuthInterceptor} from './auth-interceptor.service';
import {ApiService} from './api.service';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import {environment} from '../../../environments/environment';

describe(`AuthInterceptor`, () => {
const somePath = `/somePath`;

beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [AuthInterceptor, ApiService]
});
});

it(`should be created`, inject([AuthInterceptor], (service: AuthInterceptor) => {
expect(service).toBeTruthy();
}));


it(`should log an error to the console on error on get()`, async(inject([ApiService, HttpTestingController],
(apiService: ApiService, httpMock: HttpTestingController) => {
spyOn(console, 'error');
apiService.get(somePath).subscribe((res) => {
console.log(`in success:`, res);
}, (error) => {
console.log(`in error:`, error);
});

const req = httpMock.expectOne(`${environment.apiUri}${somePath}`);
req.flush({
type: 'ERROR',
status: 404,
body: JSON.stringify({color: `blue`})
});
expect(console.error).toHaveBeenCalled();
}))
);
});

刷新响应时,我不确定如何刷新错误响应,以便在我的拦截器中调用方法 handleError 并最终调用 console.error。文档没有任何关于我的情况的例子。感谢您提供任何帮助或建议。

最佳答案

HttpTestingController 类中的expectOne 方法返回一个TestRequest 对象。这个 TestRequest 类有一个 flush 方法,可以用来传递

both successful and unsuccessful responses.

我们可以通过返回正文以及一些额外的响应 header (如果有)来解决请求。相关资料可见here .

现在,回到如何做到这一点。您可以根据您的用例自定义以下代码片段。

http = TestBed.get(HttpTestingController);
let response: any;
let errResponse: any;
const mockErrorResponse = { status: 400, statusText: 'Bad Request' };
const data = 'Invalid request parameters';
apiService.get(somePath).subscribe(res => response = res, err => errResponse = err);
http.expectOne('url/being/monitored').flush(data, mockErrorResponse);
expect(errResponse).toBe(data);

注意:在撰写此评论时,mockErrorResponse 中需要statusText。相关资料可见here .

P.S.:TestRequest 类的error 方法可用于在我们的测试用例中模拟网络错误,因为它需要一个实例错误。以下代码片段显示了这一点。

http.expectOne(someUrl).error(new ErrorEvent('network error'));

关于angular - 如何在测试中模拟 Angular 4.3 httpClient 的错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46028804/

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