Sinon: Dokumentieren Sie, wie Sie Node so konfigurieren, dass EcmaScript-Module stubben können

Erstellt am 8. Juni 2018  ·  17Kommentare  ·  Quelle: sinonjs/sinon

EcmaScript-Module, die in einer Umgebung ausgeführt werden, die sie unterstützt (dh sie wurden nicht mit Babel in ES5 transpiliert) und eine default -Funktion exportieren, können nicht gestoppt werden, da ES-Namespaces gemäß der Spezifikation unveränderlich sind. Da Sinon nichts dagegen tun kann, geben wir explizit einen Fehler aus, wenn Sie dies versuchen: 'ES Modules cannot be stubbed' .

Aber @jdalton hat esm , einen Laufzeit-Loader für Node, der das Laden von EcmaScript-Modulen ermöglicht ( *.mjs ), und um das Stubben mit Sinon und dergleichen zu ermöglichen, hat er mutableNamespace hinzugefügt esm .

In unserem Abschnitt Gewusst wie sollte ein Artikel enthalten sein, der zeigt, wie man npm einrichten kann, um Knoten mit esm und der Option zusammen mit einem Testskript auszuführen.

Verweise:

Documentation ES2015+ Help wanted good first issue hacktoberfest pinned

Hilfreichster Kommentar

@giltayar Herzlichen Glückwunsch zur Implementierung der ESM-Unterstützung! Toller Artikel, übrigens. Wir haben immer gesagt, dass ES-Modul-Stubbing bei der Anpassung von ESM-Laufzeiten nicht möglich ist, aber wir haben auch gesagt (wie oben), dass dies auf der Verknüpfungsebene behandelt werden sollte, indem so etwas wie Proxyquire, Rewire oder ... Quibble verwendet wird wo du die Unterstützung hinzugefügt hast :)

In meinem Arbeitsprojekt haben wir proxyquire , um Abhängigkeiten von ES-Modulen zu beseitigen:

proxyquire('./mylib.mjs', {doSomething: () => 'done'})

In Quibble (von TestDouble verwendet), wo der Artikel ein Beispiel wie dieses enthält, wäre dies ziemlich gleichwertig, aber Quibble unterstützt keine Teilstubs, daher ist es etwas anders, was sie tun.

await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...

In Übereinstimmung mit dem, was zuvor gesagt wurde, wird Sinon niemals explizit Unterstützung für das Verspotten von ES-Modulen hinzufügen, da dies besser Quibble, Proxyquire, Rewire, NormalModuleReplacementPlugin (Webpack) und all den anderen Möglichkeiten überlassen bleibt, dies in einer 100% -Umgebung zu tun abhängig.

Alle 17 Kommentare

Ich habe darüber nachgedacht, genau das zu schreiben :)

Das "Problem" ist, dass es eine Vielzahl verschiedener Möglichkeiten gibt, wie esm verwendet werden kann, aber wir sollten zumindest den häufigsten Fall abdecken, von dem ich annehmen würde, dass er über das Flag require bis zum node Prozess. Ich begann mit Inhalt füllen, wie die Config - Datei zu verwenden , hier , aber es scheint , es ist auch möglich , einen JSON - String als Umgebungsvariable zu liefern als auch (, zusätzlich zu einer Hash - Optionen , wenn Code verwendet wird ).

Hi @ fatso83!

Die Option cjs.mutableNamespace ist standardmäßig aktiviert, sodass keine Konfiguration erforderlich ist. Das Stubben funktioniert mit .js aber nicht mit .mjs _ ( .mjs Dateien sind gesperrt, daher keine esm Optionen) _.

@jdalton Vielen Dank, dass Sie uns über die Unterscheidung zwischen js und mjs informiert haben. Das erklärt, warum dieser Typ es nicht zum

cc @ jim-king-2000

Ich möchte einen Unit-Test mit minimalen Kosten schreiben. Wenn die Lösung so schwierig wäre, würde ich den Unit-Test lieber mit Mock abbrechen. Schließlich ist ein Mock-Test nicht die zwingende Methode, um ein robustes Online-System aufzubauen. Aber ist es als letztes Mittel möglich, dass Sinon das "Proxyrequire" (oder so ähnlich) für mich einpackt?

@ Jim-King-2000 Das ist außerhalb des Rahmens. Sie haben sich ausdrücklich für ein Modulsystem entschieden, dessen Exporte unveränderlich sein sollen. Das sind leider Kosten, die Sie selbst tragen müssen. Das Verpacken von Modulladern, damit sie in allen möglichen Szenarien (Knoten, Browser, mit / ohne Transpiler usw.) funktionieren, ist zu kostspielig und hat nichts mit den erklärten Zielen dieses Projekts zu tun.

Ich verstehe die Relevanz von Sinon und Modulsystem nicht ganz (es tut mir leid). Was ich brauche, ist ein Js / Node-Mock-Unit-Test-Framework (oder eine Bibliothek wie das Java-Gegenstück Mockito) ohne Babel. Existiert es also?

Kurz gesagt, für Ihre spezifische Nische: derzeit nicht: schluchzen:
Im Allgemeinen: Ja, es gibt Möglichkeiten, dies für fast jede Kombination von Frameworks und Laufzeiten zu erreichen.

In Java-Begriffen ist es so, als würden Sie Ihr gesamtes System mit Java static -Methoden implementieren und dann versuchen, die Klassen mit Mockito zu verspotten. Das geht nicht.

Abgesehen davon müssen Sie Ihre *.mjs -Dateien nur in *.js umbenennen, damit die Dinge funktionieren. Dies scheint ein pragmatischer Mittelweg zu sein, da Sie ohne bekannte Nachteile Testbarkeit erlangen.

Für die Verspottung der statischen Funktion von Java verwenden wir Powermock. Aber ich kann den Vergleich nicht vollständig verstehen. Übrigens mag ich Java nicht, die Entwicklung ist zu langsam. Jetzt unterstützt es immer noch NICHT async / await.

Ich benutze * .mjs überall, alle Quellcodes sind mjs-Dateien. Darüber hinaus bedeutet dies, dass ich wieder auf babel zurückgreifen muss (Einführung zusätzlicher Entwicklungs- / Laufzeitarbeit und unordentlicher Aufrufstapel). Es ist in Ordnung, wenn ich nur die Testdateien wieder in * .js ändern könnte.

Ich werde ut mit Mock aufgeben (andere Tests sind intakt), bis ich andere kostengünstige Wege finde.

@ fatso83 Danke für die Hilfe die ganze Zeit.

Hat jemand versucht zu streiten ? 🤔

Zu Ihrer Information, ich habe die ESM-Unterstützung von Node.js in "testdouble.js" implementiert, einer Spottbibliothek. Es ist möglich. Ich habe über die Implementierung in diesem Blogbeitrag geschrieben:

https://dev.to/giltayar/mock-all-you-want-supporting-es-modules-in-the-testdouble-js-mocking-library-3gh1

Würde mich freuen, hier zu helfen, wenn jemand es übernehmen möchte ..

@giltayar Herzlichen Glückwunsch zur Implementierung der ESM-Unterstützung! Toller Artikel, übrigens. Wir haben immer gesagt, dass ES-Modul-Stubbing bei der Anpassung von ESM-Laufzeiten nicht möglich ist, aber wir haben auch gesagt (wie oben), dass dies auf der Verknüpfungsebene behandelt werden sollte, indem so etwas wie Proxyquire, Rewire oder ... Quibble verwendet wird wo du die Unterstützung hinzugefügt hast :)

In meinem Arbeitsprojekt haben wir proxyquire , um Abhängigkeiten von ES-Modulen zu beseitigen:

proxyquire('./mylib.mjs', {doSomething: () => 'done'})

In Quibble (von TestDouble verwendet), wo der Artikel ein Beispiel wie dieses enthält, wäre dies ziemlich gleichwertig, aber Quibble unterstützt keine Teilstubs, daher ist es etwas anders, was sie tun.

await quibble.esm('./mylib.mjs', {doSomething: () => 'done'}, 'yabadabadoing') // not sure what this third param does ...

In Übereinstimmung mit dem, was zuvor gesagt wurde, wird Sinon niemals explizit Unterstützung für das Verspotten von ES-Modulen hinzufügen, da dies besser Quibble, Proxyquire, Rewire, NormalModuleReplacementPlugin (Webpack) und all den anderen Möglichkeiten überlassen bleibt, dies in einer 100% -Umgebung zu tun abhängig.

@ fatso83 Wenn ich fragen darf, warum dies so ein überzeugtes "niemals explizit Unterstützung hinzufügen" ist? Ich habe das hier in den letzten Tagen mehrmals gelesen, während ich verzweifelt nach einer Lösung gesucht habe, um meinen ES6-Modulcode zu verspotten.

Keine Lösungen bei Jest dokumentiert, keine sind hier. Ich hätte fast aufgegeben, bis ich den Artikel von @giltayar gefunden hatte. So eine Erleichterung. Ich habe etwas mit Quibble arbeiten lassen, bis mir klar wurde, dass ich nur testdouble.js verwenden kann.

Es ist bereits schwierig genug, dass in JavaScript jedes Paket seinen eigenen Dokumentationsstil hat und meistens keine echten API-Dokumente, aber es ist einfach zu viel, herauszufinden, wie Testbibliotheken funktionieren, Bibliotheken verspotten und Modullader zum Verspotten von Bibliotheken funktionieren .

Ich stimme vollkommen zu, wenn Sie sagen, dass Sie sich auf Sinon konzentrieren, während andere sich darauf konzentrieren können, diese Pakete für den "Endbenutzer" -Programmierer miteinander zu verbinden. Ich möchte nur zeigen, dass Programmierer wie ich wirklich Schmerzen haben, und ich bin sicher, dass sich viele freuen würden, wenn der Prozess vereinfacht würde, insbesondere wenn viele in den nächsten Jahren auf ES-Module umsteigen würden.

Ich habe kein so tiefes technisches Verständnis, ich dachte nur, dass ein Feedback meiner Erfahrung hilfreich sein könnte

@ fatso83 Wenn ich fragen darf, warum dies so ein überzeugtes "niemals explizit Unterstützung hinzufügen" ist?

Lassen Sie mich noch einmal wiederholen: Nach Ansicht der Sinon-Betreuer ist der Umgang mit verspotteten Importen für Sinon nicht möglich und wird von spezialisierten Bibliotheken besser angegangen.

Im Allgemeinen ist es nicht sinnvoll, eine Bibliothek zu erstellen, die versucht, in jeder einzelnen Laufzeit alles zu tun. Nicht einmal größere, gut finanzierte Open Source-Projekte versuchen dies.

Keine Lösungen bei Jest dokumentiert, keine sind hier. Ich hätte fast aufgegeben, bis ich den Artikel von @giltayar gefunden hatte. So eine Erleichterung. Ich habe etwas mit Quibble arbeiten lassen, bis mir klar wurde, dass ich nur testdouble.js verwenden kann.

Unterschiedliche Bibliotheken treffen unterschiedliche Entscheidungen.

Die Betreuer von testdouble.js treffen ihre eigenen Entscheidungen. Sie beschlossen, quibble zu veröffentlichen und in ihre Bibliothek zu integrieren. Gut für sie. Wenn Sie ihre Lösung mögen, dann verwenden Sie sie auf jeden Fall. Wir haben nichts als Liebe und Respekt für @searls und die Betreuer von testdouble.js.

Es ist bereits schwierig genug, dass in JavaScript jedes Paket seinen eigenen Dokumentationsstil hat und meistens keine echten API-Dokumente, aber es ist einfach zu viel, herauszufinden, wie Testbibliotheken funktionieren, Bibliotheken verspotten und Modullader zum Verspotten von Bibliotheken funktionieren .

Ich stimme vollkommen zu, wenn Sie sagen, dass Sie sich auf Sinon konzentrieren, während andere sich darauf konzentrieren können, diese Pakete für den "Endbenutzer" -Programmierer miteinander zu verbinden. Ich möchte nur zeigen, dass Programmierer wie ich wirklich Schmerzen haben, und ich bin sicher, dass sich viele freuen würden, wenn der Prozess vereinfacht würde, insbesondere wenn viele in den nächsten Jahren auf ES-Module umsteigen würden.

Wir sind nicht hier, um jedes einzelne Problem im JavaScript-Ökosystem zu lösen.

Seit mehr als einem Jahrzehnt stellen verschiedene Betreuer die Bibliotheksfamilie Sinon kostenlos zur Verfügung. Praktisch alle Arbeiten zur Wartung dieser Bibliotheken wurden in der Freizeit der Betreuer als unbezahlte Arbeit ausgeführt. Wir verwenden JavaScript selbst professionell und teilen Ihre Frustrationen. Wir haben aber nur so viel Zeit, um kostenlos zu verschenken.

Ich habe kein so tiefes technisches Verständnis, ich dachte nur, dass ein Feedback meiner Erfahrung hilfreich sein könnte

Was hilfreich wäre, wäre, wenn Sie einen Blog-Beitrag über Ihre Frustrationen schreiben würden, die sich über Abhängigkeiten lustig machen, bis Sie auf eine Lösung stoßen, die für Sie gut funktioniert, und darüber, wie Sie testdouble.js mit Ihrer speziellen Art des Ladens von JavaScript zu großem Erfolg eingesetzt haben.

Wenn sich herausstellt, dass es sich um einen soliden Blog-Beitrag handelt, würde ich ihn gerne auf sinonjs.org bewerben.

@mroderick Ich denke, ich hätte zuerst

Wir sind nicht hier, um jedes einzelne Problem im JavaScript-Ökosystem zu lösen.

Auf keinen Fall, das sollte nur zeigen, dass möglicherweise ein größerer Bedarf an Hilfe besteht als bei anderen Sprachen (nur meine Vermutung).

Der Umgang mit verspotteten Importen ist für Sinon nicht möglich und wird von spezialisierten Bibliotheken besser angegangen.

Fair genug, wie gesagt, ich kann das verstehen und wahrscheinlich haben Sie ein viel tieferes Verständnis für den Aufwand, der mit der Implementierung dieser Funktionen verbunden ist. Auch die Loader-API ist noch experimentell.

Ich arbeite derzeit an einem kleinen CLI-Tool, das ich als Open Source veröffentlichen möchte, sobald es eine funktionierende Version gibt. Wenn das erledigt ist, denke ich darüber nach, einen Blog-Beitrag darüber zu schreiben. Ich werde Sinon noch mit proxyquire versuchen, weil ich zu viele gute Dinge über Sinon gelesen habe.

Ich werde Sinon noch mit proxyquire versuchen, weil ich zu viele gute Dinge über Sinon gelesen habe.

Wir haben eine Anleitung dazu: https://sinonjs.org/how-to/link-seams-commonjs/

Wenn Sie feststellen, dass die Anleitung verbessert werden kann, senden Sie bitte eine Pull-Anfrage 👍

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen