1

Ich habe Beispiel TestComp mit ngOnInit und ngOnDestroy Methoden und ActivatedRoute Abonnement.Angular 2 Unit Testing "Kann nicht lesen '' unsubscribe" von undefined "

@Component({ 
    selector: 'test', 
    template: '', 
}) 
export class TestComp implements OnInit, OnDestroy { 

    constructor (
     private route: ActivatedRoute 
    ) { 
    } 

    ngOnInit() { 
     this.subscription = this.route.data 
      .subscribe(data => { 
       console.log('data', data.name); 
      }) 
     ; 
    } 

    ngOnDestroy() { 
     this.subscription.unsubscribe(); 
    } 
} 

Ich erhalte „nicht Eigentum lesen‚unsubscribe‘undefinierter“, wenn ich ngOnDestroy Methode von Spec-Datei aufrufen (oder wenn ich mehrere Tests leite).

Meine Spec-Datei:

describe('TestComp',() => { 
    let comp: TestComp; 
    let fixture: ComponentFixture<TestComp>; 

    beforeEach(async(() => { 
    TestBed 
    .configureTestingModule({ 
     declarations: [TestComp], 
     imports: [RouterTestingModule], 
     providers: [ 
     { 
     provide: ActivatedRoute, 
     useValue: { 
      data: { 
      subscribe: (fn: (value: Data) => void) => fn({ 
       name: 'Stepan' 
      }) 
      } 
     } 
     } 
     // { //Also tried this 
     // provide: ActivatedRoute, 
     // useValue: { 
     //  params: Observable.of({name: 'Stepan'}) 
     // } 
     // } 
     ] 
    }) 
    .compileComponents() 
    .then(() => { 
      fixture = TestBed.createComponent(TestComp);   
      fixture.detectChanges(); 
    }) 
    })); 

    it('TestComp successfully initialized',() => { 
    fixture.componentInstance.ngOnInit(); 
    expect(fixture.componentInstance).toBeDefined() 
    fixture.componentInstance.ngOnDestroy(); 
    }); 
}); 

Ich bin vorbei ActivatedRoute Wert basierend auf Antworten here, aber ich bin immer Fehler. Meine Frage ist also - was soll ich als ActivatedRoute weitergeben, um das Abonnieren und Abmelden zu ermöglichen? Example Plunker.

+1

es ist eine gute Praxis umzusetzen eine bedingte 'if (this.subscription)' um den Abmelde. Ich habe gerade den Testcode ausprobiert und einen "setTimeout" von 500ms auf den ngOnDestroy Funktionsaufruf in deinem Test gesetzt und dann den Test bestanden. Ich denke, es dauert einige Zeit, bis das Abonnement tatsächlich initialisiert wird. –

+1

@JacobNotte Das hat für mich funktioniert! Musste nur sicherstellen, dass "thissubscription" nicht "undefined" war! – SrAxi

Antwort

2

Nur Beobachter verwenden, wenn Sie da spotten:

{ 
    provide: ActivatedRoute, 
    useValue: { data: Observable.of({ name: 'Stepan' }) } 
} 
+0

Danke für die Antwort, ich versuchte '' params: Observable.of ({Name: 'Stepan'}) '' anstelle von '' Daten: Observable.of ({Name: 'Stepan'}) '', jetzt es funktioniert gut . – styopdev

1

Sie sollten das Abonnement zuerst importieren.

import { Subscription } from 'rxjs/Subscription'; 
Verwandte Themen