Proxyquire, Rewire, SandboxedModule und Sinon: Vor- und Nachteile

71

Beim Verspotten von Knotenabhängigkeiten bin ich auf folgende Bibliotheken gestoßen:

Sie scheinen alle mehr oder weniger dasselbe zu tun: Sie können require()Anrufe verspotten (mit Ausnahme von Sinon, das so ziemlich alles verspottet). Sie scheinen alle ein ziemlich ausgeklügeltes Setup zu erfordern, wobei die genaue Syntax der übergebenen Zeichenfolge zu beachten ist require- während des Refactorings nicht besonders gut.

Was sind die Vor- und Nachteile jeder Bibliothek? Wann würde ich einen über den anderen wählen? Was sind beispielhafte Anwendungsfälle, in denen sich jede Bibliothek auszeichnet? Was sind andere Produkte in diesem Bereich, die besser sind?

Robrich
quelle

Antworten:

134

Es fühlt sich total nach Betrug an, aber da sonst niemand die Frage beantwortet, geht es weiter:

  • Proxyquire übernimmt requireund ermöglicht es Ihnen, Fälschungen überall in der Abhängigkeitskette einzufügen . Für requires, die Sie nicht übernehmen, und für Methoden, die Sie nicht für requires definieren, die Sie übernehmen, wird auf das Original zurückgegriffen. Dies kann mit deaktiviert werden noCallThru. Somit wird immer noch das Original geladen, sondern nur die durch die von Ihnen definierten Dinge ersetzt. Im Gegensatz zu Rewire und SandboxedModule können Sie keine globalen Variablen für Ihre requireÜberladungen definieren.

  • Rewire übernimmt requireund injiziert __get__und __set__Eigenschaften in jedes Modul. Wenn Sie den Namen der privaten Variablen kennen, können Sie ihn ersetzen. Denken Sie an Abhängigkeitsinjektion.

  • SandboxedModule ist nahezu identisch mit Proxyquire, außer dass der gesamte Prozess in einer neuen V8-VM ausgeführt wird. (Dieser Ansatz verursacht pro Test Leistungskosten.) In Version 1.0 gibt es außerdem einen bösen Fehler, der zum Fehlschlagen führt, wenn etwas, das Sie nicht ersetzt haben, auf ein natives Modul verweist, das nicht unterstützt wird. Siehe https://github.com/robrich/sandboxed-module-graceful-fs .

  • Sinon übernimmt nicht requirewie die anderen 3. Vielmehr handelt es sich um ein traditionelleres Spottgerüst. Ersetzen Sie bestimmte Methoden durch Fälschungen oder erstellen Sie ein Modell, das nachverfolgt, wann es aufgerufen wurde.

Robrich
quelle
33
Völlig nicht schummeln - Selbstantworten sind großartig!
Chris Vandevelde
Haben Sie sofort eine Vorstellung davon, wie hoch die "Leistungskosten pro Test" sind? Oder hat jemand Perf-Tests gemacht? Wir verwenden SandboxedModule und es scheint sehr langsam zu sein. Ich habe Proxyquire schon einmal benutzt und mag es. Ich frage mich, ob es die Mühe des Entwicklers wert ist, zu wechseln.
Tandrewnichols
1
Ich habe keine Perf-Tests zwischen ihnen durchgeführt, aber ich habe eine Codebasis von Sandboxed in Proxyquire konvertiert (um den v1.0-Fehler zu umgehen) und versehentlich sehr signifikante Leistungssteigerungen erzielt.
Robrich
3
Eine weitere: sinonquire (sinon Übernahme erforderlich) github.com/rstuven/sinonquire#readme
Ricardo Stuven
Schließen sich diese jedoch alle gegenseitig aus oder können Sie welche kombinieren? Zum Beispiel ermöglicht rewire den Zugriff auf private Module, aber proxyquire scheint dies nicht zu tun. Können Sie sie also kombinieren?
GreensterRox