1

我正在尝试使用 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) -> ...身体里,而是在它之前。可能吗?

4

1 回答 1

3

您可以使用withResource. 根据文档,它会将你转换IO CfgIO 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...
    ]
于 2019-06-18T16:11:34.310 回答