2017-02-22 119 views
1

Я Haskell нуб и имеют проблемы с функциями тестирования с кислотно-states.This ист мой структура данныхТестирование Acid-State с hspec

data UserState = UserState { name :: String } 
    deriving (Eq, Ord, Read, Show, Data, Typeable) 

и это функция я хочу тест:

setName :: String -> Update UserState String     
setName n =  
    do [email protected]{..} <- 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"} не работает

+0

Я не знаю, что вы хотите протестировать. Если бы я хотел протестировать поведение 'setName', я бы применил это обновление (используя функцию' update'), а затем запросил новый 'UserState' и сравнил его с моим ожидаемым' UserState' –

+0

@ Jean-BaptistePotonnier Но как мне modell мой ожидаемый UserState? Что-то вроде этого? "UserState {name =" Mike "}" – boddAh234

ответ

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"} 
+0

Спасибо. У меня есть еще один комментарий: «openLocalState» переносит UserState из жесткого диска, а не в прошлое Userstate. Документация data.acid подробно описана: «Начальное значение состояния. Это значение используется, только если контрольная точка не найдена». – boddAh234

+0

@ boddAh234 Я думаю, вы можете удалить файл до или после каждого теста, чтобы лучше контролировать состояние базы данных во время тестов. –