C'è un buon modo per i metodi QuickCheck Happstack.State?
-
23-10-2019 - |
Domanda
Ho un insieme di metodi Happstack.State ID MAC che voglio test utilizzando QuickCheck, ma sto avendo difficoltà a capire il modo più elegante per realizzare questo. I problemi che sto funzionando in sono:
- L'unico modo per valutare un calcolo
Ev
monade è nellaIO
Monade tramitequery
oupdate
. - Non c'è alcun modo per creare un negozio MACID puramente in memoria; questo è di progettazione . Pertanto, in esecuzione le cose nel
IO
Monade significa che ci sono file temporanei per ripulire dopo ogni prova. - Non c'è modo per inizializzare un nuovo negozio MACID se non con l'
initialValue
per lo stato; non può essere generato tramiteArbitrary
meno espongo un metodo di accesso che sostituisce l'all'ingrosso stato. - Facendo intorno a tutti i mezzi di cui sopra che scrivono i metodi che solo utilizzare le funzioni di
MonadReader
oMonadState
(e l'esecuzione del test all'internoReader
oState
invece diEv
. Questo significa rinunciare alla uso digetRandom
ogetEventClockTime
e simili all'interno delle definizioni dei metodi.
Le uniche opzioni che posso vedere sono:
- Esegui i metodi in un negozio MACID getta su disco, la pulizia dopo ogni test e accontentarsi di partire dal
initialValue
ogni volta. - Scrivi i metodi per avere la maggior parte del codice di corsa in un
MonadReader
oMonadState
(che è più facilmente verificabili), e si basano su una piccola quantità di colla non QuickCheck-in grado attorno ad esso che le chiamategetRandom
ogetEventClockTime
se necessario.
C'è una soluzione migliore che sto con vista?
Soluzione
Si potrebbe checkout le proprietà QuickCheck inclusi in happstack-stato:
Se si sta solo facendo il test, e si desidera un archivio dati e getta, quindi è possibile utilizzare il risparmiatore memoria, che solo memorizza lo stato, i file di evento, e posti di blocco nella RAM. Se si perde il potere, allora tutto il vostro stato sarebbe perso. Questo va bene per i test, ma non per un vero e proprio server di vivere. Quel messaggio si è collegato al parlava di real server in tempo reale, non solo test.
Questo non aiuterà il problema initialValue, ma rende più facile l'opzione 1 dal momento che non c'è bisogno di fare qualsiasi pulizia del disco.
Per sostituire l'initialValue, si avrebbe bisogno di creare il proprio metodo che sostituisce l'all'ingrosso stato attuale.
qualcosa di simile:
newState :: YourState -> Update YourState () newState st = put st
o qualcosa del genere.
- Jeremy
Altri suggerimenti
Se si scrivono le funzioni come sopra polimorfico MonadState (o MonadReader per le query) può essere molto più facile di istituire un test harness con runState / runReader.
I generatori di codice happstack TH vanno bene con le firme del genere, da quello che ricordo.