2017-02-01 4 views
3

Ich lerne Angular 2 testen (Karma, Jasmine). Ich habe bereits einen funktionierenden Test für einen HTTP-Dienst, der größtenteils von this Semaphore tutorial on services and testing gezogen wird. Ich habe den Test direkt durch die üblichen async Arbeits (injizieren ([MyService], ...Angular 2 verspottet einen Async-Dienst, der einen anderen Dienst ruft

Mein eigentliches Programm hat einen Dienst in einem Dienst eingewickelt, wie weiter unten.

@Injectable() 
export class GlobalsService { 
    private options: Option[] = []; 
    error: any; 

    constructor(private optionService: OptionService) { } 

    public getGlobals(): void { 
    let that = this; 
    this.optionService 
     .getOptions() 
     .then(options => that.fillOptions(options)) 
     .catch(error => that.error = error); 
    } 
    [SNIP] 

Die optionService.getOptions () gibt ein Versprechen, die für die dann die Liste globalService.options füllt abgewartet. die globalsService.getGlobals() entweder synchron oder in einem Ort, wo die asynchrone (verzögert) füllen seines Inhalts versteckt sind genannt.

export class AppComponent implements OnInit { 
    constructor(private globalsService: GlobalsService) { } 

    ngOnInit() { 
    this.globalsService.getGlobals(); 
    } 
    [SNIP] 

Woran ich festhalte, ist, wie man globalsSer nennt vice.getGlobals() in einem Testkontext. Ich denke, ich soll es asynchron() nennen.

Bisher meine Mock OptionService ist:

@Injectable() 
export class MockOptionService { 
    constructor() { } 

    getOptions(): Promise<Option[]> { 
    let options: Option[] = [ 
     { id: 'NY' } // truncated property list 
    ]; 
    return Promise.resolve(options); 
    } 

} 

ich dann nennen es durch bin der Planung:

it('should get Option objects async', 
    async(inject([GlobalsService, MockOptionService], (globalsService: GlobalsService, optionService: OptionService) => { 

     globalsService.getGlobals() 
     .then(() => { 
      expect(globalsService.getOptions().length).toBe(1); 
     });  

aber mein "smart" Programmierer-Editor (Sublime Text) sagt, dass „Eigentum" dann‘existiert nicht auf Typ‚Leere‘.", ließ mich nicht sicher, ob ich async haben sollte (injizieren oder einfach nur einen tick() verwenden.

Kommentare, anyone?

Danke, Jerome.

Antwort

0

Versuchen Sie dies!

it('should get Option objects async', 
async(inject([GlobalsService, MockOptionService], (globalsService: GlobalsService, optionService: OptionService) => { 

    globalsService.getGlobals() 
    .do(value => { 
     expect(value.length).toBe(1); 
    }).toPromise(); 
}))); 
+0

.. Ändert nichts, sehe meine Antwort unten. –

0

Nach Hantieren und mehr Forschung dachte ich, zwei Dinge: * Mein Test falsch ist. globalsService.getGlobals() gibt void zurück. Die .then, oder .do, sind richtig, wenn sie sagen: "Eigentum existiert nicht". .

Was ich die Testarbeit ist das Hinzufügen einer Setup-Klausel, Ändern async machen geändert (injizieren (zu fakeAsync (injizieren (und die Injektionen und Erklärungen fixup Dies ist, was funktioniert: alle

describe('Globals Service',() => { 

    beforeEach(() => { 

    TestBed.configureTestingModule({ 
     providers: [ 
     { provide: OptionService, useClass: MockOptionService }, 
     { provide: GlobalsService, useClass: GlobalsService } 
     ] 
    }); 
    }); 

    fakeAsync(inject([GlobalsService, OptionService], (globalsService: GlobalsService, optionService: OptionService) => { 
     globalsService.getGlobals(); 
     tick(); 
     expect(globalsService.getOptions().length).toBe(1); 
    }))); 

}); 

Dank . suchen und zu Nidhin für die Beantwortung Jetzt arbeite ich auf meine Fehler() Handhabung -. das ist eine null-Fehlervariable in handle Berichterstattung() Aber das ist für einen anderen Support-Call

Jerome

Verwandte Themen