【问题标题】:Is there a good way to QuickCheck Happstack.State methods?有没有 QuickCheck Happstack.State 方法的好方法?
【发布时间】:2010-06-03 00:47:26
【问题描述】:

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

  • 评估Ev monad 计算的唯一方法是通过queryupdateIO monad 中。
  • 无法创建纯粹的内存 MACID 存储; this is by design。因此,在IO monad 中运行意味着每次测试后都有临时文件需要清理。
  • 除了initialValue 用于状态外,无法初始化新的 MACID 存储;它不能通过Arbitrary 生成,除非我公开一个替换状态批发的访问方法。
  • 解决上述所有问题意味着编写仅使用MonadReaderMonadState 功能的方法(并在ReaderState 中运行测试而不是Ev。这意味着放弃使用@方法定义中的 987654334@ 或 getEventClockTime 等。

我能看到的唯一选项是:

  • 在一次性磁盘 MACID 存储中运行方法,在每次测试后进行清理并确定每次从 initialValue 开始。
  • 编写方法让大部分代码在MonadReaderMonadState(更容易测试)中运行,并在其周围使用少量非 QuickCheck-able 胶水,调用getRandomgetEventClockTime(根据需要)。

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

【问题讨论】:

    标签: haskell quickcheck happstack


    【解决方案1】:

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

    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

    什么的。

    • 杰里米

    【讨论】:

    • withMemorySaver 的问题是它需要使用 -f 测试构建 happstack-state,这不是默认设置,也不是最初安装在我的盒子上的方式。我不想公开一个完全替换状态的方法,但我想我可以编写一个使用 withMemorySaver 并运行 NewState 的函数,并公开 that 用于测试而不是 NewState 本身。
    • 嗯。 withMemorySaver 无论如何都特定于测试套件。理论上你应该能够做到: ctl
    【解决方案2】:

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

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

    【讨论】:

    • 这就是我最初尝试做的事情,但是你无法访问诸如 getEventClockTime 和 getRandom 之类的东西,因为它们存在于 Ev monad 中。
    • 这是真的!也许我们需要一个在 Ev monad 中提供各种功能的类,然后可以被其他东西模拟。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2010-09-30
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多