【问题标题】:Haskell: Using in-memory sqlite db in Yesod Tests?Haskell:在 Yesod 测试中使用内存中的 sqlite db?
【发布时间】:2021-06-11 12:54:46
【问题描述】:

我正在尝试制作我的第一个 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 时,测试运行良好。

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

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

谢谢!

【问题讨论】:

    标签: sqlite haskell yesod-test


    【解决方案1】:

    withSqlitePool 的文档提到:

    createSqlitePool 一样,它不应该与:memory: 一起使用。

    createSqlitePool 的文档提到:

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

    我对 Yesod 和您的确切用例了解不多,无法提供更多帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-27
      • 1970-01-01
      • 2018-10-31
      • 1970-01-01
      • 1970-01-01
      • 2019-10-04
      • 1970-01-01
      • 2011-10-06
      相关资源
      最近更新 更多