2016-03-25 6 views
0

für eine Komponente einen Komponententest Schreiben, die einen Dienst mit einem emit innerhalb des Konstruktors verwendet wird, wie folgt aus:Angular2 Unit-Test-Service, der Wert bei Constructor Zeit Emit

@Injectable() 
export class Service1 { 
    public onService1Done: EventEmitter<any> = new EventEmitter(); 
    public constructor(...) { 
    this.onService1Done.emit(value); 
    } 
} 

Ich bemerke, dass, nach dem, was ich hat in dem component.spec.ts:

beforeEachProviders(() => { 
    return [ 
    provide(Service1, { useClass: MockService1 }), 
    Component1 
    ]; 
}); 

    it("check that XXX", inject(
    [Service1, Component1], (service1: Service1, component1: Component1) => { 
    service1.onService1Done.subscribe({ next:() => DoSomething() }); 
    expect(DoSomething()).toEqual(IsDone); 
    })); 
}); 
} 

der Konstruktor von Service1, und so die emit, wird aufgerufen, bevor ich die Zeichnung machen könnte, in der Prüfung;

gibt es eine Möglichkeit, dies zu vermeiden ?? um das Abonnement vor dem Konstruktor zu machen?

Wie immer, danke im Voraus.

+0

Warum müssen Sie im Konstruktor ausgeben? Abgesehen davon [sollten Sie EventEmitter nicht in Ihren Diensten verwenden] (http://stackoverflow.com/questions/36076700/what-is-the-proper-use-of-an-eventemitter). Verwenden Sie einfache Observables. –

+0

Also, wenn ich richtig verstehe, No EventEmitter in Constructor, weder in der Komponente oder Services. Aber, könnte die Verwendung eines Abonnements in einem Konstruktor richtig sein? – AntuJitsu

+0

EventEmitters sind in den Komponenten in Ordnung, wenn Sie '@Output()' verwenden. Sie in Diensten zu verwenden, ist eine schlechte Übung. Abgesehen davon bleibt meine Frage: Warum willst du einen Wert im Konstruktor des Dienstes zum Testen ausgeben? –

Antwort

-1

Ich sehe nicht, wie etwas in irgendeiner Weise abonnieren könnte, um dieses Ereignis zu erhalten, wenn die Dienstinstanz von DI erstellt wird.

Nur nicht im Konstruktor emittieren oder zumindest einige setTimeout(...) verwenden, als zumindest synchron ausführen Code hat eine Chance zu abonnieren, wenn Sie müssen.