Gibt es einen guten Weg, um die Methoden zu QuickCheck Happstack.state?
-
23-10-2019 - |
Frage
Ich habe eine Reihe von Happstack.state Macid -Methoden, die ich mit QuickCheck testen möchte, aber ich habe Probleme, die eleganteste Möglichkeit zu finden, dies zu erreichen. Die Probleme, auf die ich stoße, sind:
- Die einzige Möglichkeit, eine zu bewerten
Ev
Monad -Berechnung ist in derIO
monade überquery
oderupdate
. - Es gibt keine Möglichkeit, einen rein memory Macid Store zu erstellen. Dies ist nach Design. Daher leiten Dinge in der
IO
Monad bedeutet, dass nach jedem Test temporäre Dateien zur Aufräumung stehen. - Es gibt keine Möglichkeit, einen neuen Macid -Shop zu initialisieren, außer mit dem
initialValue
für den Staat; Es kann nicht über über generiert werdenArbitrary
Es sei denn, ich habe eine Zugriffsmethode aufdecke, die den staatlichen Großhandel ersetzt. - Wenn Sie alle oben genannten Arbeiten herumarbeiten, werden Methoden geschrieben, die nur Funktionen von verwenden
MonadReader
oderMonadState
(und durchführen des Tests im InnerenReader
oderState
Anstatt vonEv
. Dies bedeutet, auf die Verwendung von zu verzichtengetRandom
odergetEventClockTime
und dergleichen in den Methodendefinitionen.
Die einzigen Optionen, die ich sehen kann, sind:
- Führen Sie die Methoden in einem Macid-Store aus, das nach jedem Test aufräumen und sich für den Start von abhängig machen können
initialValue
jedes Mal. - Schreiben Sie die Methoden, um den größten Teil des Codes in a auszuführen
MonadReader
oderMonadState
(was leichter pünnbar ist) und verlassengetRandom
odergetEventClockTime
wie nötig.
Gibt es eine bessere Lösung, die ich übersehen kann?
Lösung
Sie können die QuickCheck-Eigenschaften auschecken, die in Happstack-State enthalten sind:
Wenn Sie nur Tests durchführen und einen Wegwerfdatenspeicher möchten, können Sie den Speicherretter verwenden, der nur den Status, Ereignisdateien und Kontrollpunkte in RAM speichert. Wenn Sie die Macht verlieren, würde der gesamte Staat verloren gehen. Das ist in Ordnung für Tests, aber nicht für einen echten Live -Server. Diese Nachricht, mit der Sie verlinkt wurden, war das Reden über echte Live -Server, nicht nur über das Testen.
Das hilft nicht beim InitialValue -Problem, erleichtert jedoch Option 1, da Sie keine Festplattenreinigung durchführen müssen.
Um das InitialValue zu ersetzen, müssten Sie Ihre eigene Methode erstellen, die den aktuellen Zustandsgroßhandel ersetzt.
etwas wie:
newState :: YourState -> Update YourState () newState st = put st
oder so.
- Jeremy
Andere Tipps
Wenn Sie Ihre Funktionen als polymorph über Monadstate (oder Monadreader für Abfragen) schreiben, kann es viel einfacher sein, einen Testkabelbaum mit RunState/RunReader einzurichten.
Die Happstack Th -Code -Generatoren sind mit solchen Unterschriften in Ordnung, soweit ich mich erinnere.