Angular 2 - 如何模拟在组件中调用的服务?

Angular 2 - how do I mock a service being called in a component?

我有一个调用服务的组件。我试图首先创建一个测试以查看是否实际创建了组件。我正在尝试模拟服务 class 但不断出现错误。我不断收到:"catch is not a function"。我已经添加了我能找到的所有可能的参考资料:

import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';
import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';

这是我的代码:

来自我的组件:

     ngOnInit():void{

           this.bindCustomerId();       
           this.bindEmploymentDetails();       
        }

private bindEmploymentDetails(){

        this.reviewService.getEmploymentDetails(this.reviewId)
        .catch(this.handleError)
        .subscribe(
            (employmentDetails: EmploymentInfo[]) =>
            {               

                 this.employmentDetails = employmentDetails;      
                 this.bindEmploymentDetailsVisibility(this.employmentDetails);
            }
        );        
    }   

我的测试:

describe('EmploymentDetailsComponent', () => {

  let component: EmploymentDetailsComponent;
  let fixture: ComponentFixture<EmploymentDetailsComponent>;
  let config: Route[] = [];

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      imports: [
          EmploymentDetailsModule,
          RouterTestingModule.withRoutes(config),
          FormsModule,
          BrowserModule,
          HttpModule,
      ],
      declarations: [  ],
      providers:[
          {
              provide:CustomerService,
              useClass: mockCustomerService
          },
          {
              provide: ReviewService,
              useClass: ReviewServiceMock
          },
          {
              provide: LookUpService,
              useClass: mockCustomerService
          }          
      ]
    })
     .compileComponents();
  }));

  beforeEach(() => {
    fixture = TestBed.createComponent(EmploymentDetailsComponent);
    component = fixture.componentInstance;
    fixture.detectChanges();

  });

  it('should create', () => {

    expect(component).toBeTruthy();    
  });

});

我用所有相同的方法为 ReviewServiceMock 创建了一个模拟 class。

import 'rxjs/add/observable/throw';
import 'rxjs/add/operator/catch';
import 'rxjs/add/operator/map';

import { Injectable } from '@angular/core';
import { Response } from '@angular/http';
import { Observable } from 'rxjs/Observable';

@Injectable()
export class ReviewServiceMock implements IReviewService{

private apiUrl: string;            



public createNewReview(customerId: number): Observable<ReviewResponse>{

    return null;
}

public getPersonalInfo(reviewId: number): Observable<PersonalInfo[]>{

    return null;
}

public getPersonalInfoForSingleCustomer(reviewId: number, customerId: number): Observable<PersonalInfo>{

    return null;
}

public getContactInfo(reviewId: number) : Observable<ContactInformation[]>{

    return null;
}

public getContactInfoForSingleCustomer(reviewId: number, customerId : number) : Observable<ContactInformation>{

    return null;
}

public saveContactInfo(contactInfo: ContactInformation, customerId : number, reviewId: number): Observable<any>{

    return null;
}

public savePersonalInfo(personalInfo: PersonalInfo, customerId : number, reviewId: number){

    return null;
}


public getEmploymentDetails(reviewId : number):Observable<EmploymentInfo[]> {

    var mm = JSON.parse(
            `[
{
    "CustomerId": 1,
    "EmployerName": "TMG",
    "EmployerAddress": "Mosley road",
    "EmploymentStartDate": "2016-12-28T13:49:36.317Z",
    "EmploymentType": {
    "Id": 1,
    "Description": "Programmer"
    },
    "OccupationType": {
    "Id": 0,
    "Description": "string"
    },
    "JobTitle": {
    "Id": 0,
    "Description": "string"
    },
    "EstimatedMonthlyIncome": 0,
    "CustomerPayingNationalInsurance": true,
    "CustomerWorkingOver16HoursAWeek": true,
    "AffectedByInsolvency": true
}
]`        );


}

public getEmploymentDetailsForSingleCustomer(reviewId : number, customerId : number):Observable<EmploymentInfo>{

    return null;
}

public saveEmploymentDetails(employmentDetails: EmploymentInfo, reviewId: number){

    return null;
}

public confirmEmploymentDetails(reviewId: number, customerId: number){        

    return null;
}

public saveCustomerDependant(customerDependant:CustomerDependant, reviewId:number){
    return null;

}

public getCustomerDependant(reviewId: number, dependantId:number){
    return null;
}

public getAllDependants(reviewId: number){
    return null;
}

public catch()
{

}

public deleteDependant(reviewId: number, dependantId:number){
    return null;
}

public getHomeOwnerAndTenantInfoForReview(reviewId: number){
    return null;
}

public saveHousingInfoMultipleCustomer(reviewId:number,housingInfo:any){
    return null;
}

public getCurrentReview(customerId: number): Observable<ReviewResponse>{
    return null;
}

}

您需要实施您的 ReviewServiceMock class。让 getEmploymentDetails 和所有其他方法 return 成为一个空的可观察对象。 -> return Observable.of([]);

问题是 getEmploymentDetails returns null 而 catch 确实不是 null

上的函数