2016-11-26 4 views
0

나는 피닉스 응용 프로그램에서 일하고 있습니다. 이 응용 프로그램은 우산 응용 프로그램의 일부입니다. "(통합 테스트 웹 응용 프로그램과 우산

  • 피닉스 웹 API ("API ")
  • 핵심 비즈니스 로직 ("핵심 ")
  • 사용자 인증이 우산에서 I는 응용 프로그램에 대한 서로 다른 영역에 대해 책임을 작은 응용 프로그램을 DB "이 두 응용 프로그램에 의존하면서,"인증 ")
  • 데이터베이스 스키마 ("DB ")

"API는 "핵심"와 "인증"모두에 따라 달라집니다. "

"db"앱에만 ecto repo가 ​​있으며 다른 모든 앱에는 ecto repo가 ​​없습니다. repo는 "db"앱에 의해 시작되고 감독됩니다.

이제 "api"응용 프로그램에서 컨트롤러를 테스트하고 싶습니다. 이것이 내가 외계인 문제에 부딪히는 곳입니다. 컨트롤러 액션을 테스트 할 때이 액션은 "auth"또는 "core"함수를 호출합니다.이 함수는 "db"(Repo.insert/2과 같은)의 Repo 함수를 호출합니다. 이것은 OwnershipError 결과 :

** (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.       

내 문제가 지금은 "API를"응용 프로그램이 "DB를 알지 않는 한 나는"API를 "시험에서 제안 된 솔루션을 사용하여이 오류를 해결할 수있는 방법을 모르겠입니다 "응용 프로그램과 연결 체크 아웃을 할 수 없습니다. "db"프로젝트에 직접 의존하는 응용 프로그램에서이 오류가 발생하면 "공유 모드"솔루션을 적용 할 수있었습니다.

제 질문은 내 "API"통합 테스트의 소유권 문제를 해결할 수있는 방법입니다. 여기

답변

1

당신의 의존의 repos가 될 필요가

  1. (오류 메시지에 설명 된대로) 우산 모드에서 테스트를 실행하는 몇 가지주의입니다 귀하의 의존의 repos가 시작되지 않을 수도 있습니다
  2. "체크 아웃"
  3. 부양
  4. REPOS는 "공유"모드가에서

, 아마 당신 test_helper.exs 힘이 (의사)과 같은 실행되지 않을 수 있습니다

ExUnit.start 

Db.Repo.start_link() 
Core.Repo.start_link() 
Auth.Repo.start_link() 

Ecto.Adapters.SQL.Sandbox.checkout(Db.Repo) 
Ecto.Adapters.SQL.Sandbox.checkout(Core.Repo) 
Ecto.Adapters.SQL.Sandbox.checkout(Auth.Repo) 

Ecto.Adapters.SQL.Sandbox.mode(Api.Repo, :manual) 
Ecto.Adapters.SQL.Sandbox.mode(Db.Repo, :shared) 
Ecto.Adapters.SQL.Sandbox.mode(Core.Repo, :shared) 
Ecto.Adapters.SQL.Sandbox.mode(Auth.Repo, :shared) 

업데이트 :

defp deps do 
    [ 
     ... 
     {:db, path: "path/to/db"}, 
     ... 
    ] 
end 
+0

mix.exs에서 DB의 프로젝트 경로를 포함하는 것을 잊지 마십시오 당신의 답변을 주셔서 감사합니다. 그것에 대한 생각 : (1) "db"앱 중 하나 인 Repo가 하나뿐입니다. repo는 감독되며 "db"앱이 시작될 때 시작되어야합니다. (2) "api"테스트를 작성할 때 "api"앱은 "api"가 "db"에 직접 종속되지 않으므로 ecto repo가 ​​있음을 알지 못합니다. 내 "app"테스트에서 Repo를 어떻게 체크 아웃 할 수 있는지 알 수없는 이유입니다. 나는 내 질문에 이것을 포함 – Thorakas

+0

@ Thorakas 내 대답은 여전히 ​​약자, 테스트는 다른 otp 응용 프로그램을 시작해야합니다. 비동기 모드인지 여부는 확실하지 않음 – ardhitama

+0

이러한 테스트는 비동기 모드에서 실행되지 않습니다. 또한 "core"와 "auth"를 시작하도록 "api"프로젝트를 구성했습니다.이 프로젝트는 "db"를 시작해야합니다. 전에 말씀 드렸듯이 제 상황에 어떻게 답할 것인지 모르겠습니다. 나는이 모듈이 "api"프로젝트에서 알려지지 않았기 때문에'Db.Repo'를 체크 아웃 할 수 없다. – Thorakas