[英]Impure property test with SmallCheck and Tasty: resource acquisition
我正在尝试使用Tasty library和SmallCheck编写基于属性的测试。 但是我需要在属性检查功能中使用IO,而且我还需要I / O资源。 所以,我把现有的测试变成了:
myTests :: IO Cfg -> TestTree
myTests getResource = testGroup "My Group"
[
testProperty "MyProperty" $
-- HOW TO CALL getResource here, but not in
-- function, so to avoid multiple acquisition
-- Some{..} <- getResource
\(x::X) -> monadic $ do -- HERE I WILL DO I/O...
]
所以,问题是:如何调用getResource一次? 所以,不是在\\(x::X) -> ...
体内,而是在它之前。 可能吗?
您可以使用withResource
。 根据文档,它会将您的IO Cfg
转换为IO Cfg
,这将产生一个“只获取一次并在树中的所有测试中共享”的资源。
它还为您提供了一个Cfg -> IO ()
函数,您可以根据需要释放Cfg
值。 我现在把这个函数作为一个no-op( \\cfg -> pure ()
),因为我不知道你的资源的性质。
myTests :: IO Cfg -> TestTree
myTests getResource =
withResource getResource (\cfg -> pure ()) $ \getResource' ->
testGroup "My Group"
[
testProperty "MyProperty" $ \(x::X) -> monadic $ do
Some{..} <- getResource'
-- DO I/O...
]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.