2017-12-30 62 views
0

In meinem Yesod-Test möchte ich einen Datensatz in der Datenbank in der Mitte des Tests ändern können. HierDb-Aktion im Yesod-Test ausführen

ist der Code, ich kam mit

 yit "post is created by authorized user" $ do 
      request $ do 
       addPostParam "ident" "dummy" 
       setMethod "POST" 
       setUrl ("http://localhost:3000/auth/page/dummy" :: Text) 
      update 0 [UserAuthorized =. True] 
      postBody PostR (encode $ object [ 
       "body" .= ("test post" :: Text), 
       "title" .= ("test post" :: Text), 
       "coverImage" .= ("test post" :: Text), 
       "author" .= (0 :: Int) 
       ]) 
      statusIs 200 

Das mit dem Fehler

• Couldn't match expected type ‘IO a0’ 
       with actual type ‘ReaderT backend0 m0()’ 
• In the second argument of ‘($)’, namely 
    ‘update 0 [UserAuthorized =. True]’ 

    In a stmt of a 'do' block: 
    runIO $ update 0 [UserAuthorized =. True] 
    In the expression: 
    do { settings <- runIO 
        $ loadYamlSettings 
         ["config/test-settings.yml", "config/settings.yml"] [] useEnv; 
     foundation <- runIO $ makeFoundation settings; 
     yesodSpec foundation $ do { ydescribe "Auth" $ do { ... } }; 
     runIO $ update 0 [UserAuthorized =. True]; 
     .... } 

versagt kann ich sagen, das ist, weil update kehrt m() statt YesodExample site() wie request, postBody und statusIs tun .

Wie könnte ich ein db-Update innerhalb dieses Tests machen?

Antwort

0

Es waren zwei Probleme darin, die erste als Sibi wies darauf hin, das ich runDB benötigt der zweite ist man kann nicht einfach einen Datensatz mit einer ganzen Zahl nachzuschlagen.

Um diese Arbeit zu bekommen habe ich den folgenden Code

runDB $ do 
    (first :: Maybe (Entity User)) <- selectFirst [] [] 
    case first of 
     Nothing -> pure() -- handle the case when the table is empty 
     Just (Entity k _) -> update k [UserAuthorized =. True] 

Dieser Fund ist der Datensatz in der DB und aktualisiert sie. Ändern Sie (first :: Maybe (Entity User)) <- selectFirst [] [], um den Datensatz auszuwählen, den Sie aktualisieren möchten.

2

Sie müssen runDB Funktion verwenden. das heißt:

runDB $ update 0 [UserAuthorized =. True] 
+0

Dies löste die Hälfte davon, ich bin fast fertig mit dem Lösen der anderen Ausgabe, die ich bald veröffentlichen werde. – Qwertie