有没有一个很好的方法来QuickCheck Happstack.State方法?

时间:2010-06-03 00:47:27

标签: haskell quickcheck happstack

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

  • 评估Ev monad计算的唯一方法是通过IOquery update monad。
  • 无法创建纯粹的内存中MACID存储; this is by design。因此,在IO monad中运行意味着每次测试后都会有临时文件清理。
  • 除了状态为initialValue之外,无法初始化新的MACID商店;它不能通过Arbitrary生成,除非我公开了一种取代州批发的访问方法。
  • 解决上述所有问题意味着编写仅使用MonadReaderMonadState功能的方法(并在ReaderState内运行测试而不是{{1}这意味着在方法定义中放弃使用EvgetRandom等。

我能看到的唯一选择是:

  • 在丢弃的磁盘MACID存储区中运行这些方法,在每次测试后清理并每次从getEventClockTime开始安装。
  • 编写方法,让大部分代码在initialValueMonadReader(更容易测试)中运行,并依赖于少量非QuickCheck的粘合剂,如有必要,请致电MonadStategetRandom

我有一个更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

您可以签出happstack-state中包含的quickcheck属性:

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

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

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

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

类似的东西:

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

或其他什么。

  • 杰里米

答案 1 :(得分:0)

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

幸运的TH代码生成器可以很好地使用我记忆中的签名。