Wie spottet localStorage in JavaScript-Unit-Tests?
Gibt es keine Bibliotheken gibt, um mock localStorage
?
Habe ich mit Sinon.JS für die meisten meiner anderen javascript mocking und haben festgestellt, es ist wirklich toll.
Meine ersten Tests haben gezeigt, dass localStorage sich belegbar in firefox (sadface) also ich werde wahrscheinlich brauchen irgendeine Art von hack umgehen :/
Meine Optionen jetzt (wie ich sehe) sind wie folgt:
- Erstellen wrapping-Funktionen, die alle meinen code nutzt und verspotten diejenigen, die
- Erstellen Sie eine Art von (möglicherweise komplizierte) state management (snapshot localStorage vor dem test, im cleanup-restore-snapshot) für localStorage.
??????
Was haltet Ihr von diesen Ansätzen und denkst du, es gibt andere bessere Wege zu gehen über diese? So oder so werde ich die daraus resultierende "Bibliothek", die ich am Ende machen auf github für open-source-Güte.
InformationsquelleAutor der Frage Anthony Sottile | 2012-07-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine einfache Möglichkeit, zu verhöhnen, als es mit Jasmin:
Wenn Sie wollen, zu verspotten, die den lokalen Speicher in allen tests, die erklären, die
beforeEach()
Funktion oben dargestellt in den globalen Gültigkeitsbereich des tests (der üblichen Stelle ist eine specHelper.js Skript).InformationsquelleAutor der Antwort Andreas Köberle
nur Modell der globalen localStorage - /sessionStorage (Sie haben die gleiche API) für Ihre Bedürfnisse.
Zum Beispiel:
Und dann, was Sie tatsächlich tun, ist etwas wie das:
InformationsquelleAutor der Antwort a8m
Berücksichtigen Sie auch die option zum injizieren von Abhängigkeiten in der Objekt-Konstruktor-Funktion.
Im Einklang mit mocking und unit-Tests, die ich mag zu vermeiden, testen Sie die Speicher-Implementierung. Zum Beispiel keinen Sinn, die Prüfung, ob die Dauer der Speicherung erhöht, nachdem Sie einen Artikel, etc.
Da ist es natürlich unzuverlässige zu ersetzen, die Methoden auf die Reale localStorage-Objekt, verwenden Sie eine "dumme" mockStorage und stub die einzelnen Methoden, wie gewünscht, wie zum Beispiel:
InformationsquelleAutor der Antwort Claudijo
Schrieb ich einfach einmal:
Nur im globalen Kontext. Mit einem wrapper-Funktion wie oben, funktioniert es Prima.
InformationsquelleAutor der Antwort user123444555621
Dies ist, was ich Tue...
InformationsquelleAutor der Antwort CharlesJHardy
Hier ist ein Beispiel mit sinon spy-und mock:
InformationsquelleAutor der Antwort Manuel Bitto
Sie nicht haben, um passieren das storage-Objekt, um jede Methode, die verwendet wird. Stattdessen können Sie eine Konfigurations-parameter für jedes Modul, das berührt den Speicher-adapter.
Ihre alte Modul
Neuen Moduls mit der config "wrapper" - Funktion
Wenn Sie das Modul in den Test-code
Den
MockStorage
Klasse könnte wie folgt AussehenWenn Sie Ihr Modul in der Produktion code, stattdessen übergeben Sie die real-localStorage-adapter
InformationsquelleAutor der Antwort user633183
Überschreiben der
localStorage
Eigenschaft der globalenwindow
Objekt, wie vorgeschlagen, einige der Antworten, die nicht funktionieren in den meisten JS-engines, denn Sie erklären dielocalStorage
Daten Eigenschaft als nicht beschreibbar und nicht konfigurierbar.Jedoch fand ich heraus, dass zumindest mit PhantomJS s (version 1.9.8) WebKit-version, die Sie verwenden könnten, die legacy-API
__defineGetter__
zu kontrollieren, was passiert, wennlocalStorage
zugegriffen wird. Es wäre noch interessant, ob das funktioniert in anderen Browsern auch.Der Vorteil dieses Ansatzes ist, dass Sie nicht haben, ändern Sie den code, den Sie zu testen.
InformationsquelleAutor der Antwort Conrad Calmez
Leider nur so können wir verspotten das localStorage-Objekt in einem test-Szenario ist um den code zu ändern, testen wir. Sie müssen wickeln Sie Ihren code in eine anonyme Funktion (die Sie sollten tun sowieso) und "dependency injection" übergeben Sie eine Referenz auf das window-Objekt. So etwas wie:
Dann, in Ihren test, können Sie angeben:
InformationsquelleAutor der Antwort John Kurlak
Entschied ich mich zu wiederholen, mein Kommentar zu Pumbaa80 die Antwort als separate Antwort so, dass es dann einfacher zu verwenden als eine Bibliothek.
Nahm ich Pumbaa80 code, verfeinert es ein bisschen, zusätzlichen tests und veröffentlicht es als npm-Modul hier:
https://www.npmjs.com/package/mock-local-storage.
Hier ist ein source-code:
https://github.com/letsrock-today/mock-local-storage/blob/master/src/mock-localstorage.js
Einige tests:
https://github.com/letsrock-today/mock-local-storage/blob/master/test/mock-localstorage.js
Modul erstellt mock-localStorage und sessionStorage auf das Globale Objekt (window oder global, die von Ihnen definiert).
In meine anderen Projekt-tests, den ich mit mocha geht das:
mocha -r mock-local-storage
zu machen, globalen Definitionen für alle code unter test.Grundsätzlich-code sieht wie folgt aus:
Beachten Sie, dass alle Methoden Hinzugefügt, die über
Object.defineProperty
so dass Sie nicht Durchlaufen werden, auf die Sie zugreifen oder entfernt, die als reguläre Elemente und werden nicht gezählt in der Länge. Auch ich habe eine Art der Registrierung von callback, die aufgerufen wird, wenn ein Element über in das Objekt. Dieser Rückruf kann verwendet werden, um zu emulieren Kontingent überschritten Fehler in den tests.InformationsquelleAutor der Antwort nikolay_turpitko
Dies ist, wie ich mag, es zu tun. Hält es einfach.
InformationsquelleAutor der Antwort Eduardo La Hoz Miranda