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 el IO monad vía query o update.
  • 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 de Arbitrary 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 o MonadState (y ejecutar la prueba en el interior Reader o State en vez de Ev. Esto significa renunciar al uso de getRandom o getEventClockTime 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 o MonadState (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 llama getRandom o getEventClockTime según sea necesario.

¿Hay una mejor solución que pase por alto?

¿Fue útil?

Solución

Puede ver las propiedades QuickCheck que se incluyen con HappStack-State:

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

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top