Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 伞形结构中的web应用程序集成测试问题_Elixir_Phoenix Framework_Ecto_Ex Unit - Fatal编程技术网

Elixir 伞形结构中的web应用程序集成测试问题

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”应用程序中测试我的控制器。这就是我遇到的一个问题

我正在开发phoenix应用程序。此应用程序是伞形应用程序的一部分。在这个保护伞中,我有一些负责应用程序不同领域的小应用程序,它们是:

  • 凤凰网api(“api”)
  • 核心业务逻辑(“核心”)
  • 用户身份验证(“auth”)
  • 数据库模式(“db”)
“api”依赖于“core”和“auth”,而这两个应用程序依赖于“db”

只有“db”应用程序有一个ecto repo,其他所有应用程序都没有。回购由“db”应用程序启动,并受监督

现在我想在“api”应用程序中测试我的控制器。这就是我遇到的一个问题与外星。当我测试一个控制器操作时,这个操作将从“auth”或“core”调用一个函数,它从“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