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 è nella IO Monade tramite query o update.
  • 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 tramite Arbitrary 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 o MonadState (e l'esecuzione del test all'interno Reader o State invece di Ev. Questo significa rinunciare alla uso di getRandom o getEventClockTime 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 o MonadState (che è più facilmente verificabili), e si basano su una piccola quantità di colla non QuickCheck-in grado attorno ad esso che le chiamate getRandom o getEventClockTime se necessario.

C'è una soluzione migliore che sto con vista?

È stato utile?

Soluzione

Si potrebbe checkout le proprietà QuickCheck inclusi in happstack-stato:

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

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top