2017-02-22 1 views
1

je suis un noob et haskell ont des problèmes avec des fonctions de test avec de l'acide-states.This ist mon structure de données acide-State Test avec hspec

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

et c'est la fonction que je veux tester:

setName :: String -> Update UserState String     
setName n =  
    do [email protected]{..} <- get 
     let newName = n 
     put $ c { name = newName } 
     return newName 
$(makeAcidic ''UserState ['setName ]) 

Ceci est mon test:

spec :: Spec 
spec = do 
    describe "test" $ 
    it "test" $ do 
      setName "Mike" `shouldBe` UserState{ name = "Mike"} 

Je ne sais pas comment modéliser mes valeurs attendues. UserState{ name = "Mike"} ne fonctionne pas

+0

Je ne sais pas ce que vous voulez tester. Si je voulais tester le comportement 'setName', j'appliquerais la mise à jour (en utilisant la fonction' update'), puis interrogerais le nouveau 'UserState' et le comparerais avec mon' UserState' attendu –

+0

@ Jean-BaptistePotonnier Mais comment puis-je modell mon UserState attendu? Quelque chose comme ça? "UserState {name =" Mike "}" – boddAh234

Répondre

1

Je ne pense pas que vous pouvez accéder à l'état de la base de données sans l'interroger. Vous avez donc besoin d'ajouter une requête pour demander votre état de base de données, par exemple comme ceci:

getUserState :: Query UserState UserState 
getUserState = ask 

Ensuite, il est possible d'écrire un test comme celui-ci:

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

Merci. J'ai un autre commentaire: "openLocalState" prend le UserState du disque dur et non le Userstate passé. La documentation Data.acid décrit en détail: "Valeur d'état initiale: cette valeur n'est utilisée que si aucun point de contrôle n'est trouvé." – boddAh234

+0

@ boddAh234 Je suppose que vous pouvez supprimer le fichier avant ou après chaque test, afin de mieux contrôler l'état de la base de données pendant les tests. –