Angular 测试-存根服务方法未定义

Angular 测试-存根服务方法未定义,angular,unit-testing,dependency-injection,Angular,Unit Testing,Dependency Injection,我已经在一个非常简单的代码上编写了一个非常简单的测试,但由于某些原因,存根服务方法是未定义的。当我使用茉莉花间谍它的工作,但这样一个简单的任务。有人能解释一下为什么会发生这种情况吗(我删除了import语句只是为了减少代码): businessarea-overview.component businessarea-overview.spec.ts 在OnInit方法中,但getBusinessAreaById未定义且不存在 我得到下面的错误 TypeError:this.businessAre

我已经在一个非常简单的代码上编写了一个非常简单的测试,但由于某些原因,存根服务方法是未定义的。当我使用茉莉花间谍它的工作,但这样一个简单的任务。有人能解释一下为什么会发生这种情况吗(我删除了import语句只是为了减少代码):

businessarea-overview.component

businessarea-overview.spec.ts

在OnInit方法中,但getBusinessAreaById未定义且不存在

我得到下面的错误

TypeError: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");
    }
}
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");
    }
}