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

时间:2015-05-29 18:08:03

标签: unit-testing haskell hspec

这就是我所拥有的:

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操作的结果来构建spec树,则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

1 个答案:

答案 0 :(得分:6)

将spec参数作为常规函数参数传递给它的块(如果你想了解正在发生的事情,请查看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"