有什么好方法来QuickCheck Happstack.State方法吗?
-
23-10-2019 - |
题
我有一组Happstack.State MacID方法,我想使用QuickCheck测试,但是我很难弄清楚最优雅的方法来实现这一目标。我遇到的问题是:
- 评估
Ev
单核计算在IO
元query
或者update
. - 无法创建纯粹的内存MacID商店; 这是设计. 。因此,在
IO
MONAD意味着每次测试后都有临时文件可以清理。 - 除了使用
initialValue
为国家;它不能通过Arbitrary
除非我公开替代状态批发的访问方法。 - 围绕上述所有工作意味着编写仅使用功能的方法
MonadReader
或者MonadState
(并在内部进行测试Reader
或者State
代替Ev
. 。这意味着放弃使用getRandom
或者getEventClockTime
以及方法定义内部的类似。
我唯一可以看到的选项是:
- 将方法运行在抛弃的磁盘上的MacID商店中,每次测试后清理,然后开始
initialValue
每一次。 - 编写将大多数代码运行的方法
MonadReader
或者MonadState
(更容易测试),并依靠少量的不可用的胶水来调用getRandom
或者getEventClockTime
有必要的。
我忽略了更好的解决方案吗?
解决方案
您可以查看Happstack-State随附的QuickCheck属性:
如果您只是进行测试,并且想要一个抛弃数据存储,那么您可以使用存储节保存器,该存储器仅存储状态,事件文件和检查点在RAM中。如果您失去权力,那么您的所有状态将会丢失。这对于测试很好,但对于真实的实时服务器来说不是很好。您链接的消息是谈论真实的直播服务器,而不仅仅是测试。
这对初始值问题无济于事,但是它确实使选项1变得更加容易,因为您不必进行任何磁盘清理。
要替换初始值,您需要创建自己的方法来替换当前状态批发。
就像是:
newState :: YourState -> Update YourState () newState st = put st
或者其他的东西。
- 杰里米
其他提示
如果您在Monadstate(或查询的Monadreader)上将功能写成多态性,则使用Runstate/Runreader设置测试安全带可能会容易得多。
据我所记得的,HappAtt TH代码生成器对这样的签名很好。
不隶属于 StackOverflow