使用SmallCheck和Delicious进行不纯属性测试:资源获取

时间:2019-06-18 12:31:44

标签: haskell smallcheck

我正在尝试用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) -> ...主体中,而是在其之前。有可能吗?

1 个答案:

答案 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...
    ]