HSpec 测试中哈斯克尔记录中的匹配"any string"



我有一个数据类Entity,该类别定义为:

data Entity = Entity { id :: String, name :: String }

和返回IO Entity的函数:

newPersistentEntity :: String -> IO Entity

我想为此写一个HSPEC测试:

spec :: Spec
spec = describe "newPersistentEntity function" $
       it "returns a new Entity with a generated id and the specified name" $
       newPersistentEntity "myName" `shouldReturn` Entity {id = <any string>, name = "myName"}

问题是ID是由数据库生成的UUID。我想断言id是进行测试通行证的字符串。

我该如何实现?

您可以创建记录,然后使用其id值创建您要比较的记录吗?类似:

new <- newPersistentEntity "myName"
new `shouldBe` Entity { id = (id new), name = "myName" }

(注意:没有足够的信息来测试此代码,将其视为某种伪代码)。

作为附带说明,您的代码看起来不像正常的持久代码,所以我假设您使用的是其他库。

Entityid不能是String,因为静态键入。但是您可能确实想强制其评估以确保其不是最底层的。

spec :: Spec
spec = describe "newPersistentEntity function" $
    it "returns a new Entity with a generated id and the specified name" $ do
        x <- newPersistentEntity "myName"
        pure $! id x  -- Force evaluation of the `id` field to ensure that
                      -- the database actually did return a string here
        name x `shouldBe` "myName"

我实际上以不同的方式我自己解决了这个问题,我将在此处显示上下文。您可能不应该使用它,因为被接受的答案更容易理解和更少的冗长。

spec :: Spec
spec = describe "newPersistentEntity function" $
       it "returns a new Entity with a generated id and the specified name" $
       newPersistentEntity "myName" >>= (`shouldSatisfy` (case
           Entity {id = _, name = "myName"} -> True
           _ -> False))

但是,要为此,您还需要应用LAMDA案例语言扩展:

{-# LANGUAGE LambdaCase #-}

相关内容

  • 没有找到相关文章

最新更新