我有一个数据类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" }
(注意:没有足够的信息来测试此代码,将其视为某种伪代码)。
作为附带说明,您的代码看起来不像正常的持久代码,所以我假设您使用的是其他库。
Entity
的id
不能是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 #-}