在测试期间访问`beforeAll`设置的值

问题描述 投票:0回答:1

这是我得到的:

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
unit-testing haskell memoization hspec test-fixture
1个回答
11
投票

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"
© www.soinside.com 2019 - 2024. All rights reserved.