2010-06-03 55 views
2

我有一套我想用QuickCheck测试的Happstack.State MACID方法,但是我很难找出最优雅的方法来完成它。我遇到的问题是:有QuickCheck Happstack.State方法的好方法吗?

  • 的唯一方法来评估Ev单子计算是通过queryupdateIO单子。
  • 无法创建纯粹的内存中MACID存储; this is by design。因此,在IO monad中运行的东西意味着在每次测试后都有临时文件要清理。
  • 除了状态为initialValue之外,没有办法初始化新的MACID存储区;它不能通过Arbitrary生成,除非我公开一个取代批发状态的访问方法。
  • 围绕所有上述装置写入仅使用内部ReaderState代替EvMonadReaderMonadState(和运行测试特征的方法的工作,这意味着放弃使用getRandomgetEventClockTime和方法定义内等。

我能看到的唯一选项是:

  • 运行在磁盘上的MACID商店扔掉的方法,清理在每次试验后和解决从开始每次。
  • 编写方法使大部分代码运行在MonadReaderMonadState(它更容易测试),并依靠少量不可快速检查的胶水,并根据需要调用getRandomgetEventClockTime

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

回答

1

你可能签了附带happstack状态下的快速检查属性:

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 

什么的。

  • 杰里米
+0

withMemorySaver的问题在于它需要使用-f测试来构建happstack-state,这不是默认设置,也不是它最初安装在我的盒子上的方式。我不想公开一个完全取代状态的方法,但我想我可以编写一个使用MemorySaver并运行NewState的函数,并且公开* *来代替NewState本身。 – 2010-06-06 00:47:30

+0

嗯。 MemoryMeaver对测试套件来说有点特定。 理论上你应该能够做到: CTL < - runTxSystem(FMAP内存newMemoryStore)(代理::代理MyState) 但是,出于某种原因Happstack.State.Saver.Impl.Memory不外露。我会在下一个版本中解决这个问题。 – stepcut 2010-06-06 01:54:41

0

如果您编写的功能多态性在MonadState(或MonadReader进行查询),它可以是一个更容易建立与runState/runReader测试工具。

happstack TH代码生成器很好,这样的签名,从我记得。

+0

这就是我原本想做的事情,但后来你失去了访问getEventClockTime和getRandom之类的东西,因为那些生活在Ev monad中。 – 2010-06-06 21:19:21

+0

这是真的! 也许我们需要一个在Ev monad中提供各种功能的类,然后它可以被别的东西嘲笑。 – 2010-06-08 04:26:46