[英]Angular 2 unit test http.get undefined
我正在嘗試使用MockBackend為異步http服務編寫角度2單元測試,但出現http.get undefined錯誤。 這是我的代碼:
Http服務:
import { Injectable } from '@angular/core';
import { Http,Headers,RequestOptions,Response } from '@angular/http';
import 'rxjs/add/operator/map';
import 'rxjs/Rx';
@Injectable()
export class HttpService {
constructor(private _http: Http) {}
/**
* Http request will time out if not received response within 20 sec
*
* @param url
* @returns {Observable<R>}
*/
getData(url : string) {
return this._http.get(url)
.timeout(20000, new Error('delay exceeded'))
.map(response => response.json());
}
}
我正在為其編寫單元測試的Custom組件方法:
private loadDetails(input : string){
this._httpService.getData("/api/test"+ input)
.subscribe(
data => {this.user = data,
// Some more logic in here based on data
},
error => { console.log( error);}
);
}
單元測試 :
import { HttpService } from "../shared/services/http.service";
import {
async,
inject,
fakeAsync,
TestBed
} from '@angular/core/testing';
import {
Http,
BaseRequestOptions,
Response,
BaseResponseOptions,
ResponseOptions
} from '@angular/http';
import { HttpModule } from '@angular/http';
import {
MockBackend,
MockConnection
} from '@angular/http/testing';
import { Observable } from 'rxjs/Rx';
import { TestingComponent } from './testing.component';
const mockHttpProvider = {
deps: [ MockBackend, BaseRequestOptions ],
useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
describe('testingComponent', () => {
let fixture,testingComponent;
// provide our implementations or mocks to the dependency injector
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
CustomComponent
],
providers: [
HttpService,
MockBackend,
BaseRequestOptions,
{provide: Http, useValue: mockHttpProvider}
]
});
fixture = TestBed.createComponent(PortfolioComponent);
testingComponent = fixture.debugElement.componentInstance;
});
it('should call loadDetails to load user details', inject(
[IPIQHttpService, MockBackend],
fakeAsync((service: HttpService, backend: MockBackend) => {
backend.connections.subscribe((connection: MockConnection) => {
let mockResponseBody= {
id: '123',
title: 'test',
empno: '456'
};
let response = new ResponseOptions({body: JSON.stringify(mockResponseBody)});
connection.mockRespond(new Response(response));
});
testingComponent.loadUserDetails('123');
expect(testingComponent.user.empno).toEqual('456');
})));
});
當我調用testingComponent.loadUserDetails('123')來調用http服務時,我正在獲取未定義的http.get方法。
知道我在這里做錯了嗎?
const mockHttpProvider = {
provide: Http,
deps: [ MockBackend, BaseRequestOptions ],
useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) => {
return new Http(backend, defaultOptions);
}
}
TestBed.configureTestingModule({
imports: [HttpModule], // <<<=== added
declarations: [
CustomComponent
],
providers: [
HttpService,
MockBackend,
BaseRequestOptions,
mockHttpProvider
]
});
終於可以了。 這是我所做的更改:
const mockHttpProvider =
{
provide: Http,
deps: [ MockBackend, BaseRequestOptions ],
useFactory: (backend: MockBackend, defaultOptions: BaseRequestOptions) =>
{ return new Http(backend, defaultOptions); }
}
TestBed.configureTestingModule({
imports: [HttpModule], // <<<=== added
declarations: [
CustomComponent
],
providers: [
HttpService,
MockBackend,
BaseRequestOptions,
mockHttpProvider
]
});
it('should call loadDetails to load user details', inject([HttpService, MockBackend, Http], (_httpService, backend, http) => {
backend.connections.subscribe(connection => {
let mockResponseBody= {
id: '123',
title: 'test',
empno: '456'
};
let response = new ResponseOptions({body: JSON.stringify(mockResponseBody)});
connection.mockRespond(new Response(response));
});
testingComponent.loadDetails('123');
expect(testingComponent.user.empno).toEqual('456');
}));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.