Elixir 伞形结构中的web应用程序集成测试问题
我正在开发phoenix应用程序。此应用程序是伞形应用程序的一部分。在这个保护伞中,我有一些负责应用程序不同领域的小应用程序,它们是:Elixir 伞形结构中的web应用程序集成测试问题,elixir,phoenix-framework,ecto,ex-unit,Elixir,Phoenix Framework,Ecto,Ex Unit,我正在开发phoenix应用程序。此应用程序是伞形应用程序的一部分。在这个保护伞中,我有一些负责应用程序不同领域的小应用程序,它们是: 凤凰网api(“api”) 核心业务逻辑(“核心”) 用户身份验证(“auth”) 数据库模式(“db”) “api”依赖于“core”和“auth”,而这两个应用程序依赖于“db” 只有“db”应用程序有一个ecto repo,其他所有应用程序都没有。回购由“db”应用程序启动,并受监督 现在我想在“api”应用程序中测试我的控制器。这就是我遇到的一个问题
- 凤凰网api(“api”)
- 核心业务逻辑(“核心”)
- 用户身份验证(“auth”)
- 数据库模式(“db”)
Repo
的函数(例如Repo.insert/2
)。这将导致出现所有者错误
:
** (DBConnection.OwnershipError) cannot find ownership process for #PID<0.458.0>.
When using ownership, you must manage connections in one
of the three ways:
* By explicitly checking out a connection
* By explicitly allowing a spawned process
* By running the pool in shared mode
The first two options require every new process to explicitly
check a connection out or be allowed by calling checkout or
allow respectively.
The third option requires a {:shared, pid} mode to be set.
If using shared mode in tests, make sure your tests are not
async.
If you are reading this error, it means you have not done one
of the steps above or that the owner process has crashed.
See Ecto.Adapters.SQL.Sandbox docs for more information.
**(DBConnection.OwnershipError)找不到#PID的所有权进程。
使用所有权时,必须在一个数据库中管理连接
在三种方式中:
*通过显式签出连接
*通过显式允许派生的进程
*通过在共享模式下运行池
前两个选项要求每个新流程都显式
签出连接或通过调用checkout或
分别允许。
第三个选项需要设置{:shared,pid}模式。
如果在测试中使用共享模式,请确保您的测试不是
异步的。
如果您正在阅读此错误,则表示您尚未执行此操作
或所有者进程已崩溃。
有关更多信息,请参阅exto.Adapters.SQL.Sandbox文档。
我现在的问题是,我不知道如何使用“api”测试中建议的解决方案修复此错误,因为“api”应用程序不知道“db”应用程序,因此无法进行连接检查。当我在一个直接依赖于“db”项目的应用程序上遇到这个错误时,我能够应用“共享模式”解决方案
我的问题是如何用我的“api”集成测试解决所有权问题。以下是在伞式模式下运行测试的几个注意事项(如错误消息中所述)
test\u helper.exs
可能看起来像这样(伪代码):
更新:
别忘了在mix.exs
defp deps do
[
...
{:db, path: "path/to/db"},
...
]
end
谢谢你的回答。关于这一点的一些想法:(1)只有一个回购协议,“db”应用程序之一。回购受监管,应在启动“db”应用程序时启动。(2) 当我为“api”编写测试时,“api”应用程序不知道存在一个ecto repo,因为“api”对“db”没有直接依赖性。这就是我不知道如何在“应用程序”测试中签出回购协议的原因。我把这个包括在我的question@Thorakas我的答案仍然有效,测试必须启动另一个otp应用程序。不确定您是否处于异步模式。这些测试不会在异步模式下运行。我还将“api”项目配置为需要启动“core”和“auth”,这两个项目本身就需要启动“db”。正如我之前所说,我不知道如何将你的答案应用于我的情况。我无法签出
Db.Repo
,因为“api”项目中不知道该模块。@Tharakas的答案已更新,添加了Db的依赖项
defp deps do
[
...
{:db, path: "path/to/db"},
...
]
end