2

我有一组 Happstack.State MACID 方法,我想使用 QuickCheck 进行测试,但我无法找出最优雅的方法来完成它。我遇到的问题是:

  • 评估Evmonad 计算的唯一方法是在IOmonad 中通过queryor update
  • 没有办法创建纯粹的内存 MACID 存储;这是设计使然。因此,在IOmonad 中运行意味着每次测试后都有临时文件需要清理。
  • 除了initialValuefor 状态,没有办法初始化一个新的 MACID 存储;Arbitrary除非我公开替换状态批发的访问方法,否则无法生成它。
  • 解决上述所有问题意味着编写仅使用MonadReaderor功能的方法(并在orMonadState内部运行测试而不是. 这意味着放弃在方法定义中使用or等​​。ReaderStateEvgetRandomgetEventClockTime

我能看到的唯一选择是:

  • 在一次性磁盘 MACID 存储中运行这些方法,在每次测试后进行清理并从initialValue每次开始着手。
  • 编写方法以使大部分代码在MonadReaderor中运行MonadState(这更容易测试),并根据需要在其周围使用少量非 QuickCheck-able 胶水来调用getRandomor getEventClockTime

有没有我忽略的更好的解决方案?

4

2 回答 2

1

您可以签出 happstack-state 中包含的快速检查属性:

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

如果您只是在进行测试,并且想要一个一次性的数据存储,那么您可以使用内存保护程序,它只将状态、事件文件和检查点存储在 RAM 中。如果你失去权力,那么你所有的状态都会丢失。这对于测试来说很好,但对于真正的实时服务器则不然。您链接到的那条消息是关于真实的实时服务器,而不仅仅是测试。

这对解决 initialValue 问题没有帮助,但它确实使选项 1 更容易,因为您不必进行任何磁盘清理。

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

就像是:

newState :: YourState -> 更新 YourState ()
newState st = 放置 st

或者其他的东西。

  • 杰里米
于 2010-06-05T23:37:56.427 回答
0

如果您将函数编写为基于 MonadState(或用于查询的 MonadReader)的多态,则使用 runState/runReader 设置测试工具会容易得多。

据我所知,happstack TH 代码生成器可以很好地处理这样的签名。

于 2010-06-06T16:42:19.523 回答