¿Existe una buena manera de QuickCheck Happstack. Métodos del estado?
-
23-10-2019 - |
Pregunta
Tengo un conjunto de métodos Happstack.state MacID que quiero probar usando QuickCheck, pero tengo problemas para descubrir la forma más elegante de lograrlo. Los problemas con los que me estoy encontrando son:
- La única forma de evaluar un
Ev
El cálculo de la monada está en elIO
monad víaquery
oupdate
. - No hay forma de crear una tienda MacID puramente en memoria; esto es por diseño. Por lo tanto, ejecutar cosas en el
IO
Mónada significa que hay archivos temporales para limpiar después de cada prueba. - No hay forma de inicializar una nueva tienda Macid, excepto con el
initialValue
para el estado; no se puede generar a través deArbitrary
A menos que expongo un método de acceso que reemplaza al estado mayorista. - Trabajar en todo lo anterior significa escribir métodos que solo usan características de
MonadReader
oMonadState
(y ejecutar la prueba en el interiorReader
oState
en vez deEv
. Esto significa renunciar al uso degetRandom
ogetEventClockTime
y las definiciones de Method de dentro de la dentro de las Métodos.
Las únicas opciones que puedo ver son:
- Ejecute los métodos en una tienda MacID en disco desechable, limpiando después de cada prueba y conformada para comenzar desde
initialValue
cada vez. - Escriba los métodos para que la mayor parte del código se ejecute en un
MonadReader
oMonadState
(que es más fácil de probar) y confía en una pequeña cantidad de pegamento que no se puede hacer a su alrededor que llamagetRandom
ogetEventClockTime
según sea necesario.
¿Hay una mejor solución que pase por alto?
Solución
Puede ver las propiedades QuickCheck que se incluyen con HappStack-State:
Si solo está haciendo pruebas y desea un almacén de datos desechable, puede usar el ahorro de memoria, que solo almacena el estado, los archivos de eventos y los puntos de control en RAM. Si pierde el poder, entonces todo su estado se perdería. Eso está bien para las pruebas, pero no para un servidor en vivo real. Ese mensaje con el que vinculaste fue hablar sobre servidores en vivo reales, no solo en las pruebas.
Eso no ayudará con el problema InitialValue, pero sí facilita la opción 1 ya que no tiene que hacer ninguna limpieza de disco.
Para reemplazar el valor inicial, necesitaría crear su propio método que reemplace el estado actual mayorista.
algo como:
newState :: YourState -> Update YourState () newState st = put st
o algo.
- Jeremy
Otros consejos
Si escribe sus funciones como Polymorphic sobre MonadState (o Monadreader para consultas), puede ser mucho más fácil configurar un arnés de prueba con RunState/RunReader.
Los generadores de código Happstack están bien con firmas como esa, por lo que recuerdo.