Frage

Kann jemand geben Sie mir ein kurzes Beispiel für die Prüfung IO Aktionen mit Monadic Quick Check?

War es hilfreich?

Lösung

Die Test.QuickCheck .Monadic Modul können Sie monadischen Code zu testen, auch Dinge, die laufen in IO.

Ein monadische Eigenschaft Test ist vom Typ PropertyM m a, wo m die Monade ist die Testläufe in und a letztlich ignoriert. Im Fall von PropertyM IO a, konvertieren Sie den monadischen Test zu einem Property von monadicIO verwendet wird; für alle anderen Monaden, Sie monadic verwenden stattdessen (die eine Funktion nimmt die Monade, etwas IO nicht laufen müssen).

In einem monadischen Test returned der Wert aus der Monade ignoriert. Um einen Ausdruck zu überprüfen, verwenden assert; einen falschen Wert asserting wird den Test nicht bestehen. Verwenden run den Code in den Monade getesteten auszuführen.

Es gibt noch andere monadischen Aktionen zur Verfügung. Zum Beispiel wird pick neue Testeingänge erzeugen aus einem Gen a und pre werden Test Voraussetzungen prüfen. Diese sind nützlich, wenn die Testeingänge oder Voraussetzungen, sich auf Werte hängen über die Monade berechnet getestet, wobei in diesem Fall die normale Art und Weise Eingänge zur Erzeugung oder precontions Überprüfung wird nicht funktionieren.

Hier ist ein Beispiel für die Prüfung einige IO Code: wir prüfen, ob nach etwas in eine temporäre Datei zu schreiben, wir, dass die gleichen Daten wieder lesen kann. Zu Demonstrationszwecken werden wir die Voraussetzung vor, dass wir mindestens ein Byte in die Datei schreiben. Die beiden Testeigenschaften das gleiche tun; verwendet man pick und pre unnötig, während der andere nicht.

import System.Directory (removeFile)
import System.IO (hGetContents, hPutStr, hSeek, openBinaryTempFile, SeekMode (..))
import Test.QuickCheck (arbitrary, Property, quickCheck, (==>))
import Test.QuickCheck.Monadic (assert, monadicIO, pick, pre, run)

-- Demonstrating pick and pre as well:
prop_writeThenRead :: Property
prop_writeThenRead = monadicIO $ do writtenData <- pick arbitrary
                                    pre $ not (null writtenData)
                                    readData <- run $ writeThenRead writtenData
                                    assert $ writtenData == readData

-- A more idiomatic way to write the above:
prop_writeThenRead2 :: [Char] -> Property
prop_writeThenRead2 writtenData = not (null writtenData) ==> monadicIO test
    where test = do readData <- run $ writeThenRead writtenData
                    assert $ writtenData == readData

writeThenRead :: [Char] -> IO [Char]
writeThenRead output = do (path, h) <- openBinaryTempFile "/tmp" "quickcheck.tmp"
                          removeFile path
                          hPutStr h output
                          hSeek h AbsoluteSeek 0
                          hGetContents h

main :: IO ()
main = do quickCheck prop_writeThenRead
          quickCheck prop_writeThenRead2

Andere Tipps

Das Standardwerk für monadischen Code testen, "Testing Monadic Code mit Quick Check „. Es zeigt verschiedene Möglichkeiten der Prüfung im Rahmen einer Monade wie IO.

Aber Sie sollten wirklich eine konkretere Frage prüfen, veröffentlichen, was es ist, dass Sie zu Test möchten.

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