我有一组Happstack.State MACID方法,我想用QuickCheck进行测试,但是我无法找到最优雅的方法来实现它。我遇到的问题是:
Ev
monad计算的唯一方法是通过IO
或query
update
monad。IO
monad中运行意味着每次测试后都会有临时文件清理。initialValue
之外,无法初始化新的MACID商店;它不能通过Arbitrary
生成,除非我公开了一种取代州批发的访问方法。MonadReader
或MonadState
功能的方法(并在Reader
或State
内运行测试而不是{{1}这意味着在方法定义中放弃使用Ev
或getRandom
等。我能看到的唯一选择是:
getEventClockTime
开始安装。initialValue
或MonadReader
(更容易测试)中运行,并依赖于少量非QuickCheck的粘合剂,如有必要,请致电MonadState
或getRandom
。我有一个更好的解决方案吗?
答案 0 :(得分:1)
您可以签出happstack-state中包含的quickcheck属性:
如果您只是在进行测试,并且想要一个丢弃的数据存储,那么您可以使用内存保护程序,它只将状态,事件文件和检查点存储在RAM中。如果你失去了力量,那么你的所有状态都会丢失。这适用于测试,但不适用于真实的实时服务器。您链接的那条消息是关于真实的实时服务器,而不仅仅是测试。
这对initialValue问题没有帮助,但它确实使选项1更容易,因为您不必进行任何磁盘清理。
要替换initialValue,您需要创建自己的方法来替换当前的批发状态。
类似的东西:
newState :: YourState -> Update YourState () newState st = put st
或其他什么。
答案 1 :(得分:0)
如果您将函数编写为MonadState(或查询的MonadReader)上的多态,则使用runState / runReader设置测试工具会轻松得多。
幸运的TH代码生成器可以很好地使用我记忆中的签名。