Angular 测试-存根服务方法未定义
我已经在一个非常简单的代码上编写了一个非常简单的测试,但由于某些原因,存根服务方法是未定义的。当我使用茉莉花间谍它的工作,但这样一个简单的任务。有人能解释一下为什么会发生这种情况吗(我删除了import语句只是为了减少代码): businessarea-overview.component businessarea-overview.spec.ts 在OnInit方法中,但getBusinessAreaById未定义且不存在 我得到下面的错误 TypeError:this.businessAreaService.getBusinessAreaById不是 作用 我知道这与这件事有关,但我无法理解为什么会发生这种事Angular 测试-存根服务方法未定义,angular,unit-testing,dependency-injection,Angular,Unit Testing,Dependency Injection,我已经在一个非常简单的代码上编写了一个非常简单的测试,但由于某些原因,存根服务方法是未定义的。当我使用茉莉花间谍它的工作,但这样一个简单的任务。有人能解释一下为什么会发生这种情况吗(我删除了import语句只是为了减少代码): businessarea-overview.component businessarea-overview.spec.ts 在OnInit方法中,但getBusinessAreaById未定义且不存在 我得到下面的错误 TypeError:this.businessAre
business-area.service.ts
@Injectable()
export class BusinessAreaService {
constructor(private http: Http) {
}
saveBusinessArea(businessArea: BusinessArea): Observable<any> {
let body = JSON.stringify(businessArea);
let headers = new Headers(AppSettings.jsonContentTypeObject);
let options = new RequestOptions({ headers: headers });
if (businessArea && businessArea.id > 0)
return this.updateBusinessArea(businessArea.id, body, options);
return this.addBusinessArea(body, options);
}
private addBusinessArea(body: Object, options: Object): Observable<BusinessArea> {
return this.http.post(AppSettings.businessAreaEndPoint, body, options)
.map(this.extractData)
.catch(this.handleError);
}
private updateBusinessArea(id: number, body: Object, options: Object): Observable<BusinessArea> {
return this.http.put(AppSettings.businessAreaEndPoint + id, body, options)
.map(this.extractData)
.catch(this.handleError);
}
getBusinessAreaById(id: number): Observable<BusinessArea> {
return this.http.get(AppSettings.businessAreaEndPoint + id)
.map(this.extractData)
.catch(this.handleError);
}
getAllBusinessAreas(): Observable<BusinessArea[]> {
return this.http.get(AppSettings.businessAreaEndPoint)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(response: Response) {
let body = response.json().items || response.json();
return body || {};
}
private handleError(error: Response) {
console.log(error);
return Observable.throw(error || "500 internal server error");
}
}
business-area.service.ts
@可注射()
出口级商务区服务{
构造函数(专用http:http){
}
saveBusinessArea(businessArea:businessArea):可观察{
让body=JSON.stringify(businessArea);
let headers=新的头(AppSettings.jsonContentTypeObject);
let options=newrequestoptions({headers:headers});
如果(businessArea&&businessArea.id>0)
返回此.updateBusinessArea(businessArea.id、body、options);
返回此.addBusinessArea(主体、选项);
}
私有addBusinessArea(主体:对象,选项:对象):可观察{
返回此.http.post(AppSettings.businessAreaEndPoint、正文、选项)
.map(此.extractData)
.接住(这个.把手错误);
}
私有更新业务区域(id:number,body:Object,options:Object):可观察{
返回此.http.put(AppSettings.businessAreaEndPoint+id、正文、选项)
.map(此.extractData)
.接住(这个.把手错误);
}
getBusinessAreaById(id:number):可观察{
返回此.http.get(AppSettings.businessAreaEndPoint+id)
.map(此.extractData)
.接住(这个.把手错误);
}
getAllBusinessAreas():可观察{
返回此.http.get(AppSettings.businessAreaEndPoint)
.map(此.extractData)
.接住(这个.把手错误);
}
私有数据(响应:响应){
让body=response.json().items | | response.json();
返回体| |{};
}
私有句柄错误(错误:响应){
console.log(错误);
返回可观察的.throw(错误| |“500内部服务器错误”);
}
}
将{provide:BusinessAreaService,useValue:businessAreaServiceStub}
更改为{provide:BusinessAreaService,useClass:businessAreaServiceStub}
你的服务等级在哪里?@dummy你想让我在这里添加服务等级的代码吗?@dummy我已经更新了code@NathanClarkBaumgartner因为businessAreaServiceStub
是在businessarea overview.spec.ts
中定义的类(在第二个代码块中),所以您必须使用useClass
describe('BusinessareaOverviewComponent', () => {
let component: BusinessAreaOverviewComponent;
let fixture: ComponentFixture<BusinessAreaOverviewComponent>;
beforeEach(async(() => {
const authServiceSpy = jasmine.createSpyObj("AuthService", ["authenticateUser"]);
authServiceSpy.authenticateUser.and.callFake(() => { return Observable.from([true]); });
//const businessAreaServiceSpy = jasmine.createSpyObj("BusinessAreaService", ["getBusinessAreaById"]);
//businessAreaServiceSpy.getBusinessAreaById.and.callFake(() => { return Observable.of(new BusinessArea()); });
TestBed.configureTestingModule({
declarations: [
BusinessAreaOverviewComponent
],
imports: [
GrowlModule,
FormsModule,
RadioButtonModule,
AutoCompleteModule,
DataTableModule,
MessagesModule
],
providers: [
{ provide: Http, useValue: httpServiceStub },
{ provide: AuthService, useValue: authServiceSpy },
{ provide: UtilityService, useValue: utilityServiceStub },
{ provide: ActivatedRoute, useValue: { params: Observable.of({id: 123})} },
{ provide: BusinessAreaService, useValue: businessAreaServiceStub }
]
}).compileComponents();
fixture = TestBed.createComponent(BusinessAreaOverviewComponent);
component = fixture.debugElement.componentInstance;
}));
it('should create the component', () => {
var businessAreaService = fixture.debugElement.injector.get(BusinessAreaService);
console.log(businessAreaService);
fixture.detectChanges();
expect(component).toBeTruthy();
});
});
export class httpServiceStub {
}
export class utilityServiceStub {
navigateTo(path: string, id: number, urlSegment){ }
}
export class businessAreaServiceStub{
getBusinessAreaById(id: number): Observable<BusinessArea> {
return Observable.of(new BusinessArea());
}
}
export class routerServiceStub {
}
this.businessAreaService.getBusinessAreaById
business-area.service.ts
@Injectable()
export class BusinessAreaService {
constructor(private http: Http) {
}
saveBusinessArea(businessArea: BusinessArea): Observable<any> {
let body = JSON.stringify(businessArea);
let headers = new Headers(AppSettings.jsonContentTypeObject);
let options = new RequestOptions({ headers: headers });
if (businessArea && businessArea.id > 0)
return this.updateBusinessArea(businessArea.id, body, options);
return this.addBusinessArea(body, options);
}
private addBusinessArea(body: Object, options: Object): Observable<BusinessArea> {
return this.http.post(AppSettings.businessAreaEndPoint, body, options)
.map(this.extractData)
.catch(this.handleError);
}
private updateBusinessArea(id: number, body: Object, options: Object): Observable<BusinessArea> {
return this.http.put(AppSettings.businessAreaEndPoint + id, body, options)
.map(this.extractData)
.catch(this.handleError);
}
getBusinessAreaById(id: number): Observable<BusinessArea> {
return this.http.get(AppSettings.businessAreaEndPoint + id)
.map(this.extractData)
.catch(this.handleError);
}
getAllBusinessAreas(): Observable<BusinessArea[]> {
return this.http.get(AppSettings.businessAreaEndPoint)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(response: Response) {
let body = response.json().items || response.json();
return body || {};
}
private handleError(error: Response) {
console.log(error);
return Observable.throw(error || "500 internal server error");
}
}