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 le IO monade via query ou update.
  • 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édiaire Arbitrary à 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 ou MonadState (et l'exécution du test à l'intérieur Reader ou State au lieu de Ev. Ce moyen de renoncer à l'utilisation de getRandom ou getEventClockTime 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 ou MonadState (qui est plus facilement testables), et compter sur une petite quantité de colle non-QuickCheck-mesure autour que les appels getRandom ou getEventClockTime si nécessaire.

Y at-il une meilleure solution que je donne sur?

Était-ce utile?

La solution

Vous pouvez checkout les propriétés QuickCheck qui sont inclus avec happstack-état:

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

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top