运行 yesod 测试中的数据库操作
Run db action in yesod test
在我的 yesod 测试中,我希望能够在测试中间修改数据库中的记录。
这是我想出的代码
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
失败并出现错误
• 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];
.... }
我可以说这是因为 update
returns m ()
而不是像 request
、postBody
和 [=18= 这样的 YesodExample site ()
] 做。
我如何能够在此测试中进行数据库更新?
您需要使用runDB
功能。即:
runDB $ update 0 [UserAuthorized =. True]
这有两个问题,Sibi 指出的第一个是我需要的 runDB
第二个是你不能只查找带有整数的记录。
为了让它工作,我使用了以下代码
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]
这会找到数据库中的记录,然后更新它。修改(first :: Maybe (Entity User)) <- selectFirst [] []
为select你要更新的记录。
在我的 yesod 测试中,我希望能够在测试中间修改数据库中的记录。
这是我想出的代码
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
失败并出现错误
• 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];
.... }
我可以说这是因为 update
returns m ()
而不是像 request
、postBody
和 [=18= 这样的 YesodExample site ()
] 做。
我如何能够在此测试中进行数据库更新?
您需要使用runDB
功能。即:
runDB $ update 0 [UserAuthorized =. True]
这有两个问题,Sibi 指出的第一个是我需要的 runDB
第二个是你不能只查找带有整数的记录。
为了让它工作,我使用了以下代码
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]
这会找到数据库中的记录,然后更新它。修改(first :: Maybe (Entity User)) <- selectFirst [] []
为select你要更新的记录。