我正在尝试用Tasty库和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) -> ...
主体中,而是在其之前。有可能吗?
答案 0 :(得分:3)
您可以使用withResource
。根据文档,它将把您的IO Cfg
转换为IO Cfg
,从而产生一种资源,该资源“将仅获得一次并在树中的所有测试之间共享。”
它还为您提供了Cfg -> IO ()
函数,您可以在需要时释放Cfg
值。由于我不知道您的资源的性质,因此我暂时不在此功能(\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...
]