I have a set of Happstack.State MACID methods that I want to test using QuickCheck, but I'm having trouble figuring out the most elegant way to accomplish that. The problems I'm running into are:
Ev
monad computation is in the IO
monad via query
or update
.IO
monad means there are temporary files to clean up after each test.initialValue
for the state; it can't be generated via Arbitrary
unless I expose an access method that replaces the state wholesale.MonadReader
or MonadState
(and running the test inside Reader
or State
instead of Ev
. This means forgoing the use of getRandom
or getEventClockTime
and the like inside the method definitions.The only options I can see are:
initialValue
each time.MonadReader
or MonadState
(which is more easily testable), and rely on a small amount of non-QuickCheck-able glue around it that calls getRandom
or getEventClockTime
as necessary.Is there a better solution that I'm overlooking?
You might checkout out the quickcheck properties that are included with happstack-state:
If you are just doing testing, and you want a throw-away data store, then you can use the memory saver, which just stores the state, event files, and checkpoints in RAM. If you lose power, then all your state would be lost. That is fine for tests, but not for a real live server. That message you linked to was talk about real live servers, not just testing.
That won't help with the initialValue issue, but it does make option 1 easier since you don't have to do any disk cleanup.
To replace the initialValue, you would need to create your own method that replaces the current state wholesale.
something like:
newState :: YourState -> Update YourState () newState st = put st
or something.