为什么Yesod的TestImport模块在loadAppSettings中忽略了Ennv?

时间:2015-11-09 00:14:43

标签: docker yesod

我已经搭建了一个Yesod应用程序。其中一个创建的文件是test / TestImport.hs。它包括以下代码段:

withApp :: SpecWith App -> Spec
withApp = before $ do
settings <- loadAppSettings
    ["config/test-settings.yml", "config/settings.yml"]
    []
    ignoreEnv
foundation <- makeFoundation settings
wipeDB foundation
return foundation

为什么它有ignoreEnv参数?即为什么在测试模式中忽略环境是合适的?

从Yesod存储库我推断TestImport.hs是从适用于该应用程序的数据库的hsfiles生成的。在我的情况下,这是Postgres之一: https://github.com/yesodweb/yesod/blob/master/yesod-bin/hsfiles/postgres.hsfiles#L9172

ignoreEnv本身的定义如下: https://github.com/yesodweb/yesod/blob/master/yesod/Yesod/Default/Config2.hs#L147

loadAppSettings runTimeFiles compileValues envUsage = do
...
value <-
    case envUsage of
        IgnoreEnv            -> return $ applyEnvValue   False mempty value'
        UseEnv               ->          applyCurrentEnv False        value'
        RequireEnv           ->          applyCurrentEnv True         value'
        UseCustomEnv env     -> return $ applyEnvValue   False env    value'
        RequireCustomEnv env -> return $ applyEnvValue   True  env    value'

出现这个问题是因为我在为Yesod和Postgres创建Docker容器后遇到了运行测试的问题。 yesod init生成的config / settings.yml中的数据库配置与Docker测试数据库不同。因为TestImport.hs忽略了环境,docker-compose run web yesod test不起作用,因为它查找localhost:5432而不是Docker IP地址和转发的DB端口,并且无法连接到测试数据库。

如果我将TestImport.hs更改为useEnv而不是ignoreEnv,它会起作用,但我想知道这是否是错误的解决方法。问题Can Yesod's DB be configured with environment variables?意味着使用环境变量来配置数据库是合适的。测试模式不同吗?

1 个答案:

答案 0 :(得分:1)

关注的是开发人员用于开发的环境变量将运行测试套件并无意中使用这些环境变量,这可能导致例如他们的开发数据库被意外擦除。 Michael Snoyman在此讨论:https://github.com/yesodweb/yesod-scaffold/issues/56

由于有两个人因此而遇到问题,可能需要一个不同的解决方案,或者在脚手架中关于测试环境的注释,默认情况下不使用环境变量会有帮助吗?