2012-09-03 6 views
9

私はFakeApplicationと埋め込みmongodbデータベースを使用するspecs2テストを持っています。Play 2.0テスト構成によるFakeApplicationセットアップ

def inMemoryMongoDatabase(name: String = "default"): Map[String, String] = { 
    val dbname: String = "play-test-" + scala.util.Random.nextInt 
    Map(
     ("mongodb." + name + ".db" -> dbname), 
     ("mongodb." + name + ".port" -> EmbeddedMongoTestPort.toString)) 
} 

override def around[T <% Result](t: => T) = { 
    running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) { 
     t // execute t inside a http session 
    } 
} 

FakeApplicationはconfディレクトリのデフォルトのapplication.conf設定と、テストごとに作成されるテストデータベースの追加設定を使用します。
これは私たちがmongodbレプリカセットをセットアップするまで見つけることができました。今、application.confはこのreplicatための設定が含まれているさらにreplicaSetのホストが見つからないためFakeApplicationは、テストが失敗し、デフォルトの設定を使用しているので

mongodb.default.replicaset { 
host1.host = "localhost" 
host1.port = 27017 
host2.host = "localhost" 
host2.port = 27018 
host3.host = "localhost" 
host3.port = 27019 
} 

を設定します。テスト用に別の設定をしたいのですが、基本的にmongodb.default.replicasetエントリを削除してください。 mongodb.default.replicasetが単純なMap [String、String]だった場合、additonalConfigurationに追加するだけで簡単にできましたが、これを実行しようとすると、期待値の型がStringではなくObjectであるため失敗します。また、pathパラメータを使って別のtest.confファイルをFakeApplicationに提供しようとしました。

override def around[T <% Result](t: => T) = { 
    running(FakeApplication(path = new java.io.File("conf/test.conf"), additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) { 
     t // execute t inside a http session 
    } 
} 

これは、設定をロードしていないため動作しませんでした。

私は非常に助けていただければ幸いです。ありがとう。これはあなたが実行しているFakeApplicationのパス(あなたには、いくつかのケースで別のパスを持っているかもしれない)であることから

クリス

答えて

3

問題は、PlayのFakeAppicationを使用して統合テストを実行するときに、test.confファイルを指定する方法です。私の統合テストでは、play -Dconfig.file=conf/test.confに電話することはできません。私がやることに成功し何

はこれです:

object FakeSalatApp extends Around { 

def EmbeddedMongoTestPort: Int = 27028 

def inMemoryMongoDatabase(name: String = "default"): Map[String, String] = { 
    val dbname: String = "play-test-" + scala.util.Random.nextInt 
    Map(
    ("mongodb." + name + ".db" -> dbname), 
    ("mongodb." + name + ".port" -> EmbeddedMongoTestPort.toString), 
    ("mongodb." + name + ".replicaset.host1.host" -> "localhost"), 
    ("mongodb." + name + ".replicaset.host1.port" -> EmbeddedMongoTestPort.toString), 
    ("mongodb." + name + ".replicaset.host2.host" -> "localhost"), 
    ("mongodb." + name + ".replicaset.host2.port" -> (EmbeddedMongoTestPort + 1).toString), 
    ("mongodb." + name + ".replicaset.host3.host" -> "localhost"), 
    ("mongodb." + name + ".replicaset.host3.port" -> (EmbeddedMongoTestPort + 2).toString)) 
    } 

override def around[T <% Result](t: => T) = { 
    running(FakeApplication(additionalConfiguration = inMemoryMongoDatabase(), additionalPlugins = Seq("se.radley.plugin.salat.SalatPlugin"))) { 
    t // execute t inside a http session 
    } 
} 
} 
0

pathを使用すると、ここでは動作しません。

私があなたのケースでお勧めするのは、Play for testモードを実行しているときにtest.confを指定することです。

play -Dconfig.file=conf/test.conf 

test.confが選択されます。あなたは普通のapplication.confも含めて、mongo設定だけを上書きすることもできます。

"single target mode"をapplication.confのmongodbに接続するデフォルトの方法にして、プロダクション構成でのみレプリカセットを使用するようにmongobの設定を上書きすることもできます。

10

当社は、統合テストのための余分な構成をロードし、同様の問題がありました。物事のScalaの側の素敵な方法があるかどうか、私たちはJavaですべての私たちのコードをやっている、知らない

private Configuration additionalConfigurations; 
@Before 
public void initialize(){ 
    Config additionalConfig = ConfigFactory.parseFile(new File("conf/integration.conf")); 
    additionalConfigurations = new Configuration(additionalConfig); 
} 
@Test 
public void testPropertiesGetLoaded() throws Exception{ 
    running(testServer(3333, fakeApplication(additionalConfigurations.asMap())), HTMLUNIT, new Callback<TestBrowser>(){ 
     public void invoke(TestBrowser browser){ 
      String specificProperty = Play.application().configuration().getString("specific.property"); 
      System.out.println(specificProperty); 
     } 
    }); 
} 

:私たちは、私たちは、次のアプローチを使用し面倒であることを手動でマップを移入しました。

2

これはPlay 2.3でのやり方です。X

  1. package configs 
    
    class AppGlobal extends GlobalSettings { 
        // Your application global settings 
        ??? 
    } 
    
  2. がアプリケーションを使用しているobject Global extends AppGlobalとアプリケーションのグローバル設定を定義します(ないルートパッケージ)パッケージ内のクラスAppGlobalに自分のアプリケーションGlobalSettingsを定義します。

  3. テストクラスで、テストグローバルを定義します。

    object TestGlobal extends AppGlobal { 
        override def onLoadConfig(config: Configuration, 
              path: File, 
              classloader: ClassLoader, 
              mode: Mode): Configuration = { 
        config ++ configuration ++ 
          Configuration.load(path, mode = Mode.Dev, 
              Map("config.file" -> "conf/test.conf")) 
        } 
    } 
    
  4. は、私は単に持っている私の場合は上記TestGlobal

    FakeApplication(withGlobal = Some(TestGlobal)) 
    
1

と偽のアプリケーションを作成します。テスト構成は、上書きしたり、全体的なアプリケーションの設定に追加する最後に追加されますすべてのテストが拡張する基本クラスを作成しました。 FakeApplicationを作成する直前に、アプリケーションの設定を設定するシステムプロパティconfig.resourceを定義します。 は、その後、私は次のように私の構成を構造化している:

application.confは:特定の構成

Test.confを一切-ENVに含まれていません:application.confを含み、ユニットが

env_localをテスト実行するように設定を定義します。 CONF:application.confが含まれており、ローカル

env_prod.confアプリケーションを実行するための設定を定義しています... env_local.confようですが、生産などのため

私のプロジェクトでは、便宜上、私は簡単にactivator -Dconfig.resource = env_local.confを実行するスクリプトlocal.sh を作成しました。

関連する問題