我正在使用HTTP.post调用为登录方法编写Uni-test,如:
this.http.post( endpoint,creds,{ headers: headers}) .map(res => res.json()) .subscribe( data => this.onLoginComplete(data.access_token,credentials),err => this.onHttpLoginFailed(err),() => this.trace.debug(this.componentName,"Login completed.") );@H_502_2@问题是我无法模拟错误分支;每次都被称为onLoginComplete方法;
这是我的测试:
it("check that Atfer Login,console show an error ",inject( [TraceService,Http,MockBackend,WsiEndpointService],(traceService: TraceService,http: Http,backend: MockBackend,wsiEndpoint: WsiEndpointService) => { let tokenTest: number = 404 ; let response: ResponSEOptions = null {} // i think i have to modify this let connection: any; backend.connections.subscribe((c: any) => connection = c); let authService: AuthService = new AuthService(http,Service1,Service2); authenticationservice.login({ "username": "a","password": "1" }); connection.mockRespond(new Response(response)); expect(ERROR); }));@H_502_2@再次感谢大家.
首先,您需要通过MockBackend覆盖XHRBackend类:
describe('HttpService Tests',() => { beforeEachProviders(() => { return [ HTTP_PROVIDERS,provide(XHRBackend,{ useClass: MockBackend }),HttpService ]; }); (...) });@H_502_2@请注意,HttpService是使用Http对象的服务,我想测试.
然后你需要注入mockBackend并订阅其connections属性.发送请求时,将调用相应的回调,您可以指定响应元素,如正文.该服务将接收此响应作为呼叫的响应.因此,您将能够基于此测试您的服务方法.
下面我将介绍如何测试HttpService的getItems方法:
it('Should return a list of items',inject([XHRBackend,HttpService,Injector],(mockBackend,httpService,injector) => { mockBackend.connections.subscribe( (connection: MockConnection) => { connection.mockRespond(new Response( new ResponSEOptions({ body: [ { id: '1',label: 'item1' }] }))); }); httpService.getItems().subscribe( items => { expect(items).toEqual([ { id: '1',label: 'item1' }]); }); }); });@H_502_2@@Injectable() export class HttpService { constructor(private http:Http) { } getItems(): Observable<any[]> { return this.http.get('/items').map(res => res.json()); } }@H_502_2@要模拟错误,只需使用mockError方法而不是mockResponSEOne:
mockBackend.connections.subscribe( (connection: MockConnection) => { connection.mockError(new Error('some error')); });@H_502_2@