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 der IO monade über query oder update.
  • 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 werden Arbitrary 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 oder MonadState (und durchführen des Tests im Inneren Reader oder State Anstatt von Ev. Dies bedeutet, auf die Verwendung von zu verzichten getRandom oder getEventClockTime 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 oder MonadState (was leichter pünnbar ist) und verlassen getRandom oder getEventClockTime wie nötig.

Gibt es eine bessere Lösung, die ich übersehen kann?

War es hilfreich?

Lösung

Sie können die QuickCheck-Eigenschaften auschecken, die in Happstack-State enthalten sind:

http://patch-tag.com/r/mae/happstack/snapshot/current/content/pretty/happstack-state/tests/happstack/state/tests

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top