2016-11-26 14 views
0

私はphoenixアプリケーションを開発中です。このアプリケーションは、傘のアプリケーションの一部です。 「(傘の統合テストWebアプリケーションの問題

  • フェニックスウェブAPI(「API」)
  • コアビジネスロジック(「コア」)
  • ユーザ認証:この傘では、私は、アプリケーションのさまざまな分野を担当小さなアプリケーションを持っていますDB "これら2つのアプリケーションが依存しながら、 "認証 ")
  • データベーススキーマ(" DB」)

"APIは" コア "と" 認証" の両方に依存します"。

"db"アプリのみがエクトリポを持っていますが、他のすべてのアプリはそうではありません。レポは "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

はあなたの依存レポはあなたの依存レポはあなたの依存

  • を開始したことがないかもしれません
  • 「チェックアウト」する必要が傘モードでテストを実行しているいくつかの注意事項(エラーメッセージで説明したように)

    1. です

      :レポ取引は、おそらくあなたの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) 
    

    更新:

    mix.exs

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

    にDBのプロジェクトのパスを含めることを忘れないでくださいあなたの答えをいただき、ありがとうございます。いくつか考えてみましょう: (1) "db"アプリの1つだけです。レポは監視され、 "db"アプリが起動されたときに開始される必要があります。 (2) "api"のテストを書くとき、 "api"アプリケーションは "api"が "db"に直接依存しないので、ecto repoがあることを知らない。 これは、私が "app"テストでRepoをどのようにチェックアウトできるかわからない理由です。 私はこれを私の質問に含めます – Thorakas

    +0

    @ Thorakas私の答えはまだ立っています。テストには他のotpアプリが起動していなければなりません。非同期モードであるかどうかわからない – ardhitama

    +0

    これらのテストは非同期モードでは実行されません。また、「コア」と「認証」を開始するように「api」プロジェクトを設定しました。これらのプロジェクトでは、開始するには「db」が必要です。私が前に述べたように、あなたの答えを私の状況に適用する方法はわかりません。このモジュールは "api"プロジェクトでは知られていないので、 'Db.Repo'をチェックすることはできません。 – Thorakas

    関連する問題