Тестирование кислотного состояния с помощью hspec
Я - хук из Haskell, и у меня проблемы с тестированием функций с кислотными состояниями. Это моя структура данных
data UserState = UserState { name :: String }
deriving (Eq, Ord, Read, Show, Data, Typeable)
и это функция, которую я хочу проверить:
setName :: String -> Update UserState String
setName n =
do c@UserState{..} <- get
let newName = n
put $ c { name = newName }
return newName
$(makeAcidic ''UserState ['setName ])
Это мой тест:
spec :: Spec
spec = do
describe "test" $
it "test" $ do
setName "Mike" `shouldBe` UserState{ name = "Mike"}
Я понятия не имею, как смоделировать мои ожидаемые значения. UserState{ name = "Mike"}
не работает
1 ответ
Решение
Я не думаю, что вы можете получить доступ к состоянию базы данных, не запрашивая его. Поэтому вам нужно добавить запрос для запроса состояния вашей базы данных, например, так:
getUserState :: Query UserState UserState
getUserState = ask
Тогда можно написать такой тест:
withDatabaseConnection :: (AcidState UserState -> IO ()) -> IO ()
withDatabaseConnection =
bracket (openLocalState UserState{name = "initial name"})
closeAcidState
spec :: Spec
spec = do
around withDatabaseConnection $ do
describe "test" $
it "test" $ \c -> do
_ <- update c (SetName "Mike")
userState <- query c GetUserState
userState `shouldBe` UserState{ name = "Mike"}