这是我得到的:
spec :: Spec
spec = do
manager <- runIO newManager
it "foo" $ do
-- code that uses manager
it "bar" $ do
-- code that usees manager
runIO
的文档建议我可能应该使用beforeAll
来代替,因为我不需要manager
来构建规格树,我只需要它来运行每个测试,并在我的使用中在这种情况下,最好让他们共享同一个经理,而不是为每个测试创建一个新经理。
如果您不需要 IO 操作的结果来构建规格树,beforeAll 可能更适合您的用例。
beforeAll :: IO a -> SpecWith a -> Spec
但我不知道如何从测试中访问管理器。
spec :: Spec
spec = beforeAll newManager go
go :: SpecWith Manager
go = do
it "foo" $ do
-- needs "manager" in scope
it "bar" $ do
-- needs "manager" in scope
Spec 参数作为常规函数参数传递给 it 块(如果您想了解发生了什么,请查看
Example
类型类的关联类型)。一个完全独立的示例是:
import Test.Hspec
main :: IO ()
main = hspec spec
spec :: Spec
spec = beforeAll (return "foo") $ do
describe "something" $ do
it "some behavior" $ \xs -> do
xs `shouldBe` "foo"
it "some other behavior" $ \xs -> do
xs `shouldBe` "foo"