Тестирование кислотного состояния с помощью 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"}
Другие вопросы по тегам