2017-07-16 2 views
0

Ich spottet einen Dienst durch Erstellen seiner Mock-Klasse in Spec-Datei. In meiner Komponente gibt es eine Funktion, die den Datendienst aufruft. Wenn die Spezifikation läuft, geht sie erfolgreich zur Mock-Methode, gibt aber die Daten, d. H. Den Inhalt innerhalb von beobachtbar, nicht zurück. Der Fehler, den ich bekomme, ist "Erwartet undefined, um truthy zu sein." für meinen Fall.Unit Testing: Angular4: Jasmine: Antwort ist nicht definiert in abonnieren, wenn Kontrolle von gefälschten Service-Methoden

Spec-Datei


import { BaseRequestOptions, Http, HttpModule, Response, ResponseOptions } from '@angular/http'; 
import { MockBackend } from '@angular/http/testing'; 
import { AddserviceCenterRepairAuthorityComponent } from './add-serviceCenter-repair-authority.component'; 
import { TestBed, ComponentFixture, async, inject } from '@angular/core/testing'; 
import { By } from '@angular/platform-browser'; 
import { DebugElement, NO_ERRORS_SCHEMA } from '@angular/core'; 
import { FormsModule } from '@angular/forms'; 
import { SelectItem, MultiSelectModule, CalendarModule } from 'primeng/primeng'; 
import { CoreUIModule } from 'core-ui'; 
import { RouterTestingModule } from '@angular/router/testing'; 
import { Router } from '@angular/router'; 
import { scooterRepairService } from '../services/scooterRepair.service'; 
import { StorageService } from 'core-shared/core.service'; 
import { serviceCenterRepairAdd } from '../models/serviceCenter-repair-add.model'; 
import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; 
import { Observable } from 'rxjs/Observable'; 

import { IMissingscooterRepair } from '../models/missing-scooter-repair'; 
import { serviceCenterRepairRecord } from '../models/serviceCenter-repair-record.model'; 
import { RepairClass } from '../models/repairClass.model'; 
import { RepairCode } from '../models/repairCode.model'; 
import { serviceCenterRepairSearch } from '../models/serviceCenter-repair-search.model'; 
import { scooterRepairSearch } from '../models/scooter-repair-search.model'; 
import { scooterRepairRecord } from '../models/scooter-repair-record.model'; 



fdescribe('AddserviceCenterRepairAuthorityComponent',() => { 
    let fixture: ComponentFixture<AddserviceCenterRepairAuthorityComponent>; 
    let de: DebugElement; 
    let el: HTMLElement; 
    let router: Router; 
    let comp: AddserviceCenterRepairAuthorityComponent; 

    class MockscooterRepairService { 
     headers: Headers = new Headers(); 
     private help = ''; 
     private scooterRepairAuthorityApiurl = 'http://localhost:3000/scooterRepairAuthority'; 

     constructor() { 
      this.headers.append('appuser', 'devnxd'); 
     } 

     public submitserviceCenterRepair(serviceCenterRepairAddRecord): Observable<any> { 
      if (serviceCenterRepairAddRecord.hasOwnProperty()) { 
       return Observable.throw('Error occurred, please try again'); 
      } else { 
       return Observable.of(
        { 
         'isSuccess': true, 'results': [{ 'recordId': 1 }], 'recordId': 1 
        }); 


      } 
     } 


     clone(object: any) { 
      return JSON.parse(JSON.stringify(object)); 
     } 

     public getscooterInitials(): Observable<SelectItem[]> { 

      return Observable.of(
       { 

       }); 
     } 

     public getThresholdValues(isAmountOnly: boolean): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 
     public getRepairClassItems(): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 
     public getRepairCodeItems(): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 
     public getPercentageApprovalItems(): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 


     public getUnitCountItems(scooterInitials: string[]): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 

     public getscooterClassItems(scooterInitials: string[]): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 

     public getFacilityItems(): Observable<SelectItem[]> { 
      return Observable.of(
       { 

       }); 
     } 


     public searchscooterRepairs(scooterRepairSearch: scooterRepairSearch): Observable<scooterRepairRecord[]> { 
      return Observable.of(
       { 

       }); 
     } 


     public searchserviceCenterRepairs(strFacility: string[], strStatusCode: string[], strthreshold: string[], lastUpdatedDate: Date, 
      insertDate: Date, effectiveStartDate: Date, effectiveEndDate: Date) { 
      return Observable.of(
       { 

       }); 
     } 



     public submitscooterRepair(scooterRepairRecord: scooterRepairRecord, isValidated: boolean = true): Observable<any> { 
      return Observable.of(
       { 

       }); 
     } 
     public searchMissingscooterRepairs(): Observable<IMissingscooterRepair> { 
      return Observable.of(
       { 

       }); 
     } 

     private getDefaultHeaders(): Headers { 
      const headers: Headers = new Headers(); 
      // headers.append('appuser', this.auth.user.userName); 
      headers.append('appuser', 'devvws'); 
      headers.append('Content-Type', 'application/json'); 
      // headers.append('Cache-Control', 'no-cache'); 
      // headers.append('Pragma', 'no-cache'); 
      return headers; 
     } 



     private handleError(error: Response) { 
      return Observable.throw(error.statusText || 'Server error'); 
     } 

     private extractData(res: Response, isResultOnly: boolean = true) { 
      const data = res.json(); 
      console.log(data); 
      // const data = res.json(); // This will be used when actual service calling 
      if (data.isSuccess) { 
       return isResultOnly ? data.results : data; 
      } else if (data.isException && data.errors.length > 0) { 
       this.handleError(data.errors[0]); 
      } 
      return {}; 
     } 
     convertFeatureListToNGPrimeDropdownOptions(list: any, labelKey, valueKey): SelectItem[] { 
      const data = this.clone(list); 
      const options: SelectItem[] = []; 
      for (let i = 0; i < data.length; i++) { 
       this.changeKeyName(data[i], labelKey, 'label'); 
       this.changeKeyName(data[i], valueKey, 'value'); 
       options.push(data[i]); 
      } 
      return options; 
     } 

     private changeKeyName(obj: any, oldKey: string, newKey: string): any { 
      if (obj.hasOwnProperty(oldKey)) { 
       obj[newKey] = obj[oldKey]; 
       delete obj[oldKey]; 
      } 
      return obj; 
     } 

    } 

    // async beforeEach 
    beforeEach(async(() => { 
     class RouterStub { 
      navigateByUrl(url: string) { return url; } 
     } 




     TestBed.configureTestingModule({ 
      declarations: [AddserviceCenterRepairAuthorityComponent], // declare the test component 
      schemas: [NO_ERRORS_SCHEMA], 
      providers: [scooterRepairService, MockBackend, StorageService, 
       BaseRequestOptions, 
       { 
        provide: Http, 
        useFactory: (backend, options) => new Http(backend, options), 
        deps: [MockBackend, BaseRequestOptions] 
       }, 
       { provide: scooterRepairService, useClass: MockscooterRepairService }, 
      ], 
      imports: [BrowserAnimationsModule, FormsModule, MultiSelectModule, CalendarModule, CoreUIModule, RouterTestingModule] 

     }) 
      .compileComponents(); // compile template and css 
    })); 

    // synchronous beforeEach -- used if component is having external templates 
    beforeEach(() => { 
     fixture = TestBed.createComponent(AddserviceCenterRepairAuthorityComponent); 
     comp = fixture.componentInstance; 
    }); 

    it('component is created',() => { 
     expect(comp).toBeTruthy(); 
    }); 

    xit('unsuccessful should be true when serviceCenterRepairAddRecord is empty object',() => { 

     comp.serviceCenterRepairAddRecord = <serviceCenterRepairAdd>{}; 
     const recordAddedSuccessfully = comp.onAddserviceCenterRepairClick(); 
     fixture.detectChanges(); 
     expect(recordAddedSuccessfully).toBe(2); 
    }); 


    it('unsuccessful should be true when serviceCenterRepairAddRecord is not empty object',() => { 

     comp.serviceCenterRepairAddRecord = <serviceCenterRepairAdd>{ 
      'facilityId': 1, 'statusCode': '200', 'thresholdAmount': 432, 
      'effectiveStartDate': new Date(), 'effectiveEndDate': new Date(), 'builtEndDate': new Date() 
     }; 
     comp.unsuccessful = 0; 
     const recordAddedSuccessfully = comp.onAddserviceCenterRepairClick(); 
     fixture.detectChanges(); 
     expect(recordAddedSuccessfully).toBeTruthy(); 
    }); 


    xit('on cancel scooter repair click',() => { 
     const spy = spyOn((<any>comp).router, 'navigateByUrl'); 
     comp.onCancelserviceCenterRepairClick(); 

     fixture.detectChanges(); 
     expect(spy).toHaveBeenCalledWith('cra'); 

    }); 
}); 

component.ts


onAddserviceCenterRepairClick() { 
     this.scooterRepairService.submitserviceCenterRepair(this.serviceCenterRepairAddRecord).subscribe(
      response => this.submitedSuccess = response.recordId 
      , 
      error => this.errorMessage = <any>error, 
      () => { 
       if (this.submitedSuccess === -1) { 
        alert('Record cannot be added'); 
        this.unsuccessful = 2; 
       } else { 
        this.unsuccessful = 1; 
        this.router.navigate(['cra'], { queryParams: { from: 'serviceCenterRepairSubmit' } }); 
       } 
      } 

     ); 

    } 

Wenn die Steuerung kehrt von der gefälschten Dienstklasse shoul es d Das Objekt wurde von Observable.of zurückgegeben. Aber in der Antwort Variable im obigen component.ts Code ist undefiniert.

Bitte helfen ..!

Antwort

0

Ihre Rückgabe eines Array von Objekten nach Ihrem Rückgabetyp in der Methode. Aber Sie sind wieder nur ein Objekt, die diese Fehler verursachten

return Observable.of([{ 

        }]); 
+0

auch wenn ich return Observable.of ( { 'isSuccess': true }); Ich habe den gleichen Fehler – Maddy

+0

Ich habe Sie nicht .. – Aravind

+0

auch wenn ich return Observable.of ({'isSuccess': true}); Ich habe den gleichen Fehler – Maddy

0

Antwort immer leer sein wird, da der ursprüngliche Aufruf von Mock-Klasse durchgeführt wurde. Überprüfen Sie für den Komponententest den Wert von thisbitemedSuccess, der eine Instanzvariable ist. Überprüfen Sie, ob es gleich -1 oder 1 ist, die vom gefälschten Observable gesendet wurden.