Angular2 unit-Tests : testen einer Komponente Konstruktor
Alles ist im Titel : wie kann man testen, was geschieht in der Komponente Konstruktor ?
Für Ihre Informationen, ich bin mit einem service, die erfordert, dass Sie eine Einstellung, und ich würde gerne sehen, wenn die 2 Methoden, die ich rufen Sie im Konstruktor aufgerufen werden, richtig.
Meine Komponente Konstruktor :
constructor(
public router: Router,
private profilService: ProfileService,
private dragula: DragulaService,
private alerter: AlertService
) {
dragula.drag.subscribe((value) => {
this.onDrag(value);
});
dragula.dragend.subscribe((value) => {
this.onDragend(value);
});
}
Injizieren ein fake
Ich würde gerne, das problem ist, dass ich nicht erreichen kann contrsuctor um zu testen, ob meine stub aufgerufen wird
Was meinst du mit "erreichen-der Konstruktor"? Es wird aufgerufen, wenn die Komponente instanziiert, indem die DI-system in der test-Bett, wenn Sie
Ich meine, ich möchte, um zu testen, ob der code im Konstruktor wird ausgelöst, durch die Prüfung der Konstruktor als ob es eine andere Methode
Sie kann aufrufen des Konstruktors durch die manuelle Erstellung einer
DragulaService
mit der test-Bett und Spion auf Ihre Methoden?Ich würde gerne, das problem ist, dass ich nicht erreichen kann contrsuctor um zu testen, ob meine stub aufgerufen wird
Was meinst du mit "erreichen-der Konstruktor"? Es wird aufgerufen, wenn die Komponente instanziiert, indem die DI-system in der test-Bett, wenn Sie
TestBed.createComponent(YourComponent)
.Ich meine, ich möchte, um zu testen, ob der code im Konstruktor wird ausgelöst, durch die Prüfung der Konstruktor als ob es eine andere Methode
Sie kann aufrufen des Konstruktors durch die manuelle Erstellung einer
new YourComponent(...)
, aber Sie sollte lassen sich die DI-system seine Arbeit machen. Das ist, wie das Gerät in der Praxis benutzt werden, denken Sie über deren öffentliche Schnittstelle wie die anderen Komponenten sehen. Wie unten, es klingt wie Sie schreiben (oder zu schreiben versucht) spröde tests, die sind zu eng mit der aktuellen Umsetzung.
InformationsquelleAutor trichetriche | 2017-04-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich Spritzen würde ein fake-service, mit dem DI-system, was bedeuten würde, schreiben die tests so etwas wie dieses:
Diese können Sie trigger "drag-Ereignisse", wenn Sie durch aufrufen von
.next
auf das Thema, die Ursachen Abonnenten der Felder auf die falschen Dienst genannt, bekommen. Sie können dann stellen Sie Behauptungen auf, die Ergebnisse, die Sie erwarten von.Beachten Sie, dass Sie brauchen nicht zu rufen
constructor
selbst; diese Methode wird aufgerufen, wenn das DI-system instanziiert die Komponente, D. H. wennTestBed.createComponent
genannt wird.Ich würde empfehlen, dass Sie nicht Spion auf die Komponente Methoden (z.B.
this.onDrag
) und stellen Sie sicher, dass Sie aufgerufen werden, sondern testen, was diese Methoden tun sollte, als Ergebnis geschieht; dies macht die tests robuster auf Veränderungen in der konkreten Umsetzung (ich schrieb ein bisschen darüber auf meinem blog: http://blog.jonrshar.pe/2017/Apr/16/async-angular-tests.html).Nein, ich sage, dass Sie test der Konstruktor, indem sichergestellt wird, dass die Ereignisse an den Dienst angeschlossen sind, um das richtige Verhalten. Sie könnte einfach testen, dass der Konstruktor ruft
.subscribe
auf die entsprechenden ausspioniert Felder auf ein fake-service (zum Beispiel etwas wie{ drag: jasmine.createSpyObj('fake drag event', ['subscribe']), ... }
), aber das ist sehr eng mit der aktuellen konkreten Umsetzung, anstatt die eigentliche Funktionalität, die Sie implementieren.Der Punkt ist, dass ich wissen möchte, ob der Dienst wird als der Konstruktor nicht, wenn der service aufgerufen wird, wenn ich es nenne. Ich meine, ich sollte nicht haben, es zu nennen, würde ich lieber testen, ob der Konstruktor ruft es korrekt (also, wenn jemand ändert die Konstruktor-code, wirft es einen Fehler)
der service nicht genannt, im Konstruktor, gerade abonniert. Die tatsächliche Verhalten, die Sie versuchen, zu implementieren, und daher, was sollte man testen, was passiert, wenn ein drag-Ereignis Auftritt. Das ist es, was der obige test überprüft. "ich meine, ich sollte nicht haben, um es nennen" - call was? "also, wenn jemand die änderungen der Konstruktor-code ist, wird eine Fehlermeldung" - wenn der Konstruktor verpasst, so dass der service nicht mehr abonniert, und sonst nichts geändert wird, um sicherzustellen, dass die Funktionalität funktioniert immer noch der test schlägt fehl. Das ist das, was soll geschehen.
kein problem. Ich schrieb sogar einen blog-post vor kurzem auf unsere Winkel-Tests für einige Kolleginnen und Kollegen, Sie finden es möglicherweise hilfreich: blog.jonrshar.pe/2017/Apr/16/async-angular-tests.html
InformationsquelleAutor jonrsharpe
Der einfache Weg zu testen, irgendwas im Konstruktor-Funktion zu erstellen, die Komponenteninstanz und dann zu testen.
Eine Sache zu beachten, dass, wenn Sie möchten, eine Unterscheidung zwischen Konstruktor und ngOnInit, dann rufen Sie nicht
fixture.detectChanges()
innenbeforeEach()
. stattdessen rufen Sie manuell, Wann immer Sie brauchen.InformationsquelleAutor Md Kamrul Hasan Pulok
Seit der OP fest: "ich würde gerne sehen, wenn die 2 Methoden, die ich rufen Sie im Konstruktor aufgerufen werden, richtig." Ich habe einen besseren Ansatz.
Schreiben Sie einen unit-test. Sie nicht brauchen, um den test-Bett für diese. Es wird sich verlangsamen Ihren tests eine Menge. Instanziieren Sie Ihr verspottet manuell. Setzen Sie Ihre Spione auf die Methoden, die Sie interessiert, und rufen Sie dann die Komponente Konstruktor manuell mit den stubs haben Sie instanziiert und setzen Spione auf. Dann testen, ob ausspioniert wurden Methoden genannt, richtig.
Der Schlüssel ist, zu erweitern, Ihre stubs von der original-service-Klassen.
jasmine.createSpyObj
hilft für Spott Winkel-Klassen wieRouter
.Sie können dies für jede Komponente. Sie wirklich shan nicht verwenden, der Prüfstand für die Reine unit-tests. Ansonsten die tests dauern ewig, zu vervollständigen. Vertrauen Sie mir, ich bin mit ihm zu kämpfen, gerade jetzt. Check this out: chariotsolutions.com/blog/post/...
Nichts für ungut, aber es ist irgendwie zu dumm um zu vermeiden, mit Abstraktionen zur Verfügung, während es gibt so viel Merkmale. Zum Beispiel, wenn ich testen Sie meine Leistungen, die Verspottung, das Backend ist sehr nützlich ! Und es braucht das testbed für. Und auf einem 14k Zeilen code für 200+ tests, meine Testzeit war 6s, ich denke, ich bin gut 😀
Ich bin beleidigt. Ich bin nicht sagen, Sie nicht zu verhöhnen, dude. Ich sage Ihnen, wie Sie verspotten es sauberer und schneller. Sie sollten natürlich den test-Bett, wenn nötig. Ich sage nur, dass es nicht notwendig ist für das, was Sie gefragt haben. Vielen Dank für den down-vote.
Sagen Sie mir, um zu testen, alle meine Komponenten wie diese. Meine ursprüngliche Frage war nur, wie um zu testen, Konstrukteur, nicht, wie alle meine tests. Ich fast immer notwendig, das testbed, und wenn ich nicht, dann weiß ich es nicht verwenden. Aber ich will nicht ausschließen, nur, weil ich werde gewinnen 5ms. Und ich sage Ihnen, dass Ihre Antwort ist zu spät, außerhalb des Themas, und nicht geeignet für meine Fälle. Also ja, ich unten Stimmen, und wenn Sie nicht wissen, ich verlieren, Punkte zu, indem man so tut, so ist es nicht aus Vergnügen !
InformationsquelleAutor aycanadal