2014-06-12 6 views
52

Wenn Knoten Abhängigkeiten spöttisch, habe ich auf den folgenden Bibliotheken passiert:Proxyquire, verkabeln, SandboxedModule und Sinon: Vor-und Nachteile

Sie alle scheinen mehr oder weniger dasselbe zu tun: allo W wenn Sie require() Anrufe (mit Ausnahme von Sinon, die ziemlich viel verspottet). Sie alle scheinen ein ziemlich kompliziertes Setup zu erfordern, wobei sie die genaue Syntax der an übergebenen Zeichenkette notieren - nicht groß beim Refactoring.

Was sind die Vor- und Nachteile jeder Bibliothek? Wann würde ich eins über das andere wählen? Was sind Beispiele für Anwendungsfälle, in denen sich jede Bibliothek auszeichnet? Was sind andere Produkte in diesem Raum, die besser sind?

Antwort

102

Es fühlt sich ganz wie Betrug, aber da sonst niemand die Frage beantwortet, hier geht:

  • Proxyquire nimmt benötigen über und lässt Sie Fakes überall in der Abhängigkeitskette injizieren. Für erfordert, dass Sie nicht übernehmen und für Methoden, die Sie nicht definieren, verlangt, dass Sie übernehmen, wird es auf das Original zurückfallen. Dies kann mit noCallThru deaktiviert werden. So lädt es immer noch das Original, ersetzt nur Dinge mit den Dingen, die Sie definieren. Im Gegensatz zu Rewire und SandboxedModule können Sie keine globalen Variablen für die erforderlichen Überladungen definieren.

  • Rewire übernimmt die Anforderungen und injiziert und __set__ Eigenschaften in jedes Modul. Wenn Sie den Namen der privaten Variablen kennen, können Sie ihn ersetzen. Denken Sie an die Abhängigkeits-Injektion

  • SandboxedModule ist nahezu identisch mit Proxyquire, außer dass es den gesamten Prozess in einem neuen V8 vm ausführt. (Dieser Ansatz unterliegt Kosten pro Test). In Version 1.0 gibt es auch einen schwerwiegenden Fehler, der dazu führt, dass ein Fehler auftritt, wenn ein nicht ersetztes Element ein natives Modul referenziert, das nicht unterstützt wird. Siehe https://github.com/robrich/sandboxed-module-graceful-fs.

  • Sinon übernimmt nicht wie die anderen erfordern 3. Eher ist es ein traditioneller Spott Rahmen. Ersetzen Sie angegebene Methoden durch Fälschungen, oder erstellen Sie einen Mock, der bei seinem Aufruf verfolgt.

+17

Total nicht betrügen - Selbstantworten sind großartig! –

+0

Haben Sie eine Idee, wie hoch die "Kosten pro Testleistung" sind? Oder hat jemand Perf-Tests durchgeführt? Wir verwenden SandboxedModule und es scheint sehr langsam zu sein. Ich habe vorher Proxyquire benutzt und mag es. Fragst dich, ob es sich lohnt, den Dev-Aufwand zu wechseln. – tandrewnichols

+1

Ich habe keine Perf-Tests zwischen ihnen ausgeführt, aber ich habe eine Codebase von Sandboxed in Proxyquire konvertiert (um den v1.0-Bug zu umgehen) und versehentlich sehr bedeutende Leistungssteigerungen erzielt. – robrich