2012-03-25 4 views
9

Wenn ich reinen Code mit QuickCheck testen möchte, muss ich oft eine Arbitrary Instanz schreiben. Um monadischen Code zu testen, kann ich Test.QuickCheck.Monadic wie in diesem article beschrieben verwenden.Gibt es eine monadische Version von Arbitrary für die Verwendung mit QuickCheck?

Meine Frage ist: Gibt es eine kanonische Art, Daten zu generieren, die von einem monadischen Kontext abhängen? Gibt es eine monadische Version von Arbitrary? Wie würden Sie Daten generieren, die einen monadischen Kontext erfordern?

Antwort

3

erzeugen Randomly einen Kontext

einfach einen geeigneten zufälligen monadischen Kontext erzeugen. Wenn du Tests durchführst, kannst du nicht in einem imaginären Monadenland bleiben, du musst dir tatsächlich eine bestimmte Monade aussuchen, um sie zu testen. Hast du eine Liste Monade ausgewählt? Erzeugt zufällig eine Liste als Kontext. Eine staatliche Monade? Erzeugt zufällig einen Wert des Zustandstyps für den Kontext. Schriftsteller? Erzeugt zufällig ein Protokoll.

erzeugen Randomly eine Aktion

Also, was tun Sie generieren möchten, genau? Wenn es sich um eine monadische Aktion handelt, müssen Sie eine Möglichkeit bereitstellen, monadische Aktionen für Ihre spezielle Monade zu erstellen, basierend auf seinen einzigartigen Primitiven. z.B. zufällig generierte Statusaktionen sollten zufällig aus den State-Primitiven get und put erstellt werden.

sie Sammen

Wenn Sie Quick Fähigkeiten verwenden, um eine Funktion f, die eine einstellige Aktion erzeugt zu erzeugen und Quick Check verwenden, um einen Kontext c zu erzeugen, dann können Sie einfach c >>= f sie zusammen zu stellen. Oder Sie können einfach die Aktion a direkt generieren, und tun Sie c >> a.

6

Gen ist im Grunde, was Sie mit Arbitrary Instanzen in einem Monade Rahmen zu arbeiten, verwenden, da die Arbitrary Typklasse im Grunde nur ein Anbieter von Gen a Generatoren ist.