0

我正在尝试制作我的第一个 Yesod 网站,现在正在添加测试。

我是这样设置的:

shortblitoWebServerSpec :: ShortblitoWebServerSpec -> Spec
shortblitoWebServerSpec =
  yesodSpecWithSiteGenerator $
    runNoLoggingT $
      withSqlitePool ":memory:" 1 $ \pool -> do
        let app =
              App
                { appLogLevel = LevelWarn,
                  appStatic = shortblitoWebServerStatic,
                  appConnectionPool = pool,
                  appGoogleAnalyticsTracking = Nothing,
                  appGoogleSearchConsoleVerification = Nothing
                }
        _ <- runSqlPool (runMigrationQuiet migrateTables) pool
        pure app

并进行一些测试:

spec :: Spec
spec = shortblitoWebServerSpec $
  ydescribe "ShortenerR" $ do
    yit "Home page exists" $ do
      get ShortenerR
      statusIs 200
    yit "Post to shorten" $ do
      postBody ShortenerR "test"
      statusIs 200

当我运行时,我收到以下错误:

11/Jun/2021:14:52:15 +0200 [Error#yesod-core] SQLite3 returned ErrorError while attempting to perform prepare "SELECT \"id\",\"long\" FROM \"url\" WHERE \"long\"=?": no such table: url @(yesod-core-1.6.18-Ab7hNtiUzJgGsCLpKcpJyh:Yesod.Core.Class.Yesod src/Yesod/Core/Class/Yesod.hs:688:5)

但是,当我更改:memory:test.db测试时运行良好。

所以内存中的数据库在某个地方丢失了。但我不确定如何防止这种情况。

我该如何解决这个问题?所以我可以使用内存数据库进行测试吗?

谢谢!

4

1 回答 1

0

withSqlitePool提及的文档:

就像createSqlitePool,这不应该与 :memory: 一起使用。

createSqlitePool提及的文档:

请注意,这不应与 :memory: 连接字符串一起使用,因为池会定期删除连接,从而破坏您的数据库。相反,使用withSqliteConn.

我对 Yesod 和您的确切用例知之甚少,无法提供更多帮助。

于 2021-06-12T11:06:46.147 回答