2017-02-03 4 views
0

Ich bin mit aktivierten Route Route Datenänderungen zu hören:Mock ActivatedRoute Objekt in Angular2

this.activatedRoute.params.subscribe(params => { 
    this.model.load(params['id']); 
}); 

In meinem Unit-Test ich diesen Teil verspotten will this.activatedRoute.params.subscribe Testdaten zur Verfügung zu stellen:

mockActivatedRoute.params = jasmine.createSpy('mockActivatedRoute.params') 
    .and 
    .returnValue(Observable.of(<Params>{id: 1})); 

Aber ich erhalte einen Fehler:

Type 'Spy' is not assignable to type 'Observable'. Property '_isScalar' is missing in type 'Spy'

Was bedeutet dieser Fehler? Ich benutze ähnliche Ansätze für andere Beobachter und alles funktioniert gut, aber nur diesen Ort.

+0

Sie könnten stattdessen 'ActivatedRoute' Stummel. Übergeben Sie in Ihrem Komponententest einen Stub anstelle der tatsächlichen Klasse "ActivatedRoute". Erstellen Sie eine "params" -Eigenschaft auf Ihrem Stub, die eine Observable des gewünschten Werts zurückgibt. – AngularChef

+0

Bleib bei deiner Syntax, ich denke, es sollte 'jasmine.createSpy ('params')' sein. – AngularChef

+0

@ AngularFrance, es ist nur Spionenname. Ja, ich kann Stub übergeben, aber ich brauche mehr Code, um andere Teile dieser Objekte auszuspionieren. In meinem Fall besser, tatsächlich zu verwenden. – VadimB

Antwort

3

Wie wäre es, wenn Sie versuchen, die params.subscribe() Methode anstelle der params Eigenschaft auszuspionieren?

Etwas entlang der Linien von:

// This code might need some adjustments... 
class MockActivatedRoute { 
    params = { 
    subscribe: jasmine.createSpy('subscribe') 
    .and 
    .returnValue(Observable.of(<Params>{id: 1})) 
    } 
} 
+0

Scheint, dass das falsche Objekt erstellt wird. Sie müssen 'mockActivatedRoute.params.subscribe.subscribe' aufrufen. Recht? – VadimB

+0

Nein, Sie rufen die übliche 'activatedRoute.params.subscribe()' auf. Die 'createSpy()' Methode ** ersetzt ** die ursprüngliche Methode, sie suffiziert sie nicht. – AngularChef

0

Geprüft Angular 4 Arbeits

import { ActivatedRoute }     from '@angular/router'; 
import { Observable }      from 'rxjs/Rx'; 

... 

class MockActivatedRoute extends ActivatedRoute { 
    public params = Observable.of({id: 123}); 
} 

... 

describe('MyTest',() => { 
    ... 

    beforeEach(async(() => { 
    TestBed.configureTestingModule({ 
     ... 

     providers: [ { provide: ActivatedRoute, useValue: new MockActivatedRoute() } ] 
    }) 
    .compileComponents(); 
    })); 
}); 
+0

Immer noch gleich, kein Provider für ActivatedRouter –