Y at-il un bon moyen de méthodes QuickCheck Happstack.State?
-
23-10-2019 - |
Question
J'ai un ensemble de méthodes Happstack.State MacID que je veux tester en utilisant QuickCheck, mais je vais avoir du mal à déterminer la façon la plus élégante pour y parvenir. Les problèmes que je suis en cours d'exécution en sont:
- La seule façon d'évaluer un calcul de monade
Ev
est dans leIO
monade viaquery
ouupdate
. - Il n'y a aucun moyen de créer un magasin de MACID purement en mémoire; c'est par la conception . Par conséquent, en cours d'exécution des choses dans les moyens
IO
monade il y a des fichiers temporaires pour nettoyer après chaque test. - Il n'y a pas moyen d'initialiser un nouveau magasin MACID sauf avec le
initialValue
de l'État; il ne peut pas être généré par l'intermédiaireArbitrary
à moins que j'expose une méthode d'accès qui remplace le gros de l'État. - de travail autour de tous les moyens ci-dessus l'écriture des méthodes qui présente l'utilisation uniquement de
MonadReader
ouMonadState
(et l'exécution du test à l'intérieurReader
ouState
au lieu deEv
. Ce moyen de renoncer à l'utilisation degetRandom
ougetEventClockTime
et similaires dans les définitions de méthode.
Les options que je peux voir sont:
- Exécuter les méthodes dans un magasin à jeter sur disque MACID, le nettoyage après chaque test et se contenter de partir
initialValue
à chaque fois. - Ecrire les méthodes pour avoir la plupart du code exécuté dans un
MonadReader
ouMonadState
(qui est plus facilement testables), et compter sur une petite quantité de colle non-QuickCheck-mesure autour que les appelsgetRandom
ougetEventClockTime
si nécessaire.
Y at-il une meilleure solution que je donne sur?
La solution
Vous pouvez checkout les propriétés QuickCheck qui sont inclus avec happstack-état:
Si vous êtes en train de faire des tests, et que vous voulez un magasin de données à jeter, vous pouvez utiliser l'écran de la mémoire, qui vient stocke l'état, les fichiers d'événements, et des points de contrôle dans la RAM. Si vous perdez le pouvoir, alors tout votre état serait perdu. C'est très bien pour les tests, mais pas pour un vrai serveur en direct. Ce message lié à se parler de serveurs en direct réels, et pas seulement tester.
Cela ne va pas aider à la question initialValue, mais il option de make 1 plus facile puisque vous n'avez pas à faire un nettoyage de disque.
Pour remplacer le initialValue, vous devez créer votre propre méthode qui remplace le gros de l'état actuel.
quelque chose comme:
newState :: YourState -> Update YourState () newState st = put st
ou quelque chose.
- jeremy
Autres conseils
Si vous écrivez vos fonctions comme polymorphes sur MonadState (ou MonadReader pour les requêtes), il peut être beaucoup plus facile à mettre en place un harnais de test avec runState / runReader.
Les générateurs de code happstack TH sont très bien avec des signatures comme ça, je me souviens bien.