Тестирование кислотного состояния с помощью hspec

Я новичок в хаскеле, и у меня проблемы с тестированием функций с кислотными состояниями. Это моя структура данных.

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"} не работает


person alex.b    schedule 22.02.2017    source источник
comment
Я не знаю, что вы хотите проверить. Если бы я хотел проверить поведение setName, я бы применил обновление (используя функцию update), затем запросил новый UserState и сравнил его с моим ожидаемым UserState   -  person Jean-Baptiste Potonnier    schedule 23.02.2017
comment
@ Jean-BaptistePotonnier Но как смоделировать ожидаемое состояние пользователя? Что-то вроде этого? UserState {имя = Майк}   -  person alex.b    schedule 27.02.2017


Ответы (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"}
person Jean-Baptiste Potonnier    schedule 27.02.2017
comment
Спасибо. У меня есть еще один комментарий: openLocalState берет состояние пользователя с жесткого диска, а не переданное состояние пользователя. Документация Data.acid подробно описывает: Начальное значение состояния. Это значение используется только в том случае, если контрольная точка не найдена. - person alex.b; 09.03.2017
comment
@boddAh234 Думаю, вы могли бы удалить файл до или после каждого теста, чтобы лучше контролировать состояние базы данных во время тестов. - person Jean-Baptiste Potonnier; 11.03.2017