我有一组Happstack.State MacID方法,我想使用QuickCheck测试,但是我很难弄清楚最优雅的方法来实现这一目标。我遇到的问题是:

  • 评估 Ev 单核计算在 IOquery 或者 update.
  • 无法创建纯粹的内存MacID商店; 这是设计. 。因此,在 IO MONAD意味着每次测试后都有临时文件可以清理。
  • 除了使用 initialValue 为国家;它不能通过 Arbitrary 除非我公开替代状态批发的访问方法。
  • 围绕上述所有工作意味着编写仅使用功能的方法 MonadReader 或者 MonadState (并在内部进行测试 Reader 或者 State 代替 Ev. 。这意味着放弃使用 getRandom 或者 getEventClockTime 以及方法定义内部的类似。

我唯一可以看到的选项是:

  • 将方法运行在抛弃的磁盘上的MacID商店中,每次测试后清理,然后开始 initialValue 每一次。
  • 编写将大多数代码运行的方法 MonadReader 或者 MonadState (更容易测试),并依靠少量的不可用的胶水来调用 getRandom 或者 getEventClockTime 有必要的。

我忽略了更好的解决方案吗?

有帮助吗?

解决方案

您可以查看Happstack-State随附的QuickCheck属性:

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

如果您只是进行测试,并且想要一个抛弃数据存储,那么您可以使用存储节保存器,该存储器仅存储状态,事件文件和检查点在RAM中。如果您失去权力,那么您的所有状态将会丢失。这对于测试很好,但对于真实的实时服务器来说不是很好。您链接的消息是谈论真实的直播服务器,而不仅仅是测试。

这对初始值问题无济于事,但是它确实使选项1变得更加容易,因为您不必进行任何磁盘清理。

要替换初始值,您需要创建自己的方法来替换当前状态批发。

就像是:

newState :: YourState -> Update YourState ()
newState st = put st

或者其他的东西。

  • 杰里米

其他提示

如果您在Monadstate(或查询的Monadreader)上将功能写成多态性,则使用Runstate/Runreader设置测试安全带可能会容易得多。

据我所记得的,HappAtt TH代码生成器对这样的签名很好。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top