/ / Play 2.0 FakeApplicationセットアップとテスト構成-scala、mongodb、playframework-2.0、specs2

テスト設定を使用して2.0 FakeApplicationセットアップをプレイ - scala、mongodb、playframework-2.0、specs2

FakeApplicationと埋め込みmongodbデータベースを使用するspecs2テストがあります。

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にこのレプリカセットの構成が含まれます

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

FakeApplicationはデフォルトを使用するため構成レプリカセットのホストが見つからないため、テストは失敗します。テストに別の構成を設定したいのですが、基本的にmongodb.default.replicasetエントリを削除します。 mongodb.default.replicasetが単純なMap [String、String]の場合、additonalConfigurationに追加するだけで簡単ですが、これを実行しようとすると、期待値の型が文字列ではなくオブジェクトであるため失敗します。また、pathパラメーターを介してFakeApplicationに別のtest.confファイルを提供しようとしました。

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
}
}

構成をロードしなかったため、これも機能しませんでした。

助けていただければ幸いです。ありがとう。

クリス

回答:

回答№1の場合は10

統合テスト用に追加の構成をロードする場合にも、同様の問題が発生しました。マップに手動でデータを入力するのは面倒であることがわかったため、次のアプローチを使用しました。

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);
}
});
}

Scala側に優れたメソッドがあるかどうかはわかりませんが、すべてのコードをJavaで実行しています。


回答№2の場合は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
}
}
}

答え№3の2

これは私がPlay2.3.​​xでそれをした方法です

  1. アプリケーションを定義する GlobalSettings クラスで AppGlobal パッケージ内(ルートパッケージではない)

    package configs
    
    class AppGlobal extends GlobalSettings {
    // Your application global settings
    ???
    }
    
  2. アプリケーションのグローバル設定を次のように定義します object Global extends AppGlobal これはアプリケーションで使用されます。

  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))
    

回答№4の場合は1

私の場合、すべてのテストを拡張する基本クラスを作成しただけです。 FakeApplicationを作成する直前に、システムプロパティを定義します config.resource これにより、アプリケーションの構成が設定されます。 次に、構成を次のように構成しました。

application.conf:環境固有の構成は含まれていません

test.conf:application.confを含み、単体テストを実行するための構成を定義します

env_local.conf:application.confを含み、アプリケーションをローカルで実行するための構成を定義します

env_prod.conf:env_local.confと同様ですが、本番環境など用です..。

私のプロジェクトでは、便宜上、スクリプトlocal.shを作成しました。 アクティベーターを実行するだけです-Dconfig.resource = env_local.conf

@RunWith(classOf[JUnitRunner])
class ApplicationTest extends FunSuite with MockitoSugar {
System.setProperty("config.resource", "test.conf")
val app = Helpers.fakeApplication()
}

回答№5の場合は0

使用 path これは実行中のFakeApplicationのパスであるため、ここでは機能しません(場合によっては別のパスがある可能性があります)。

あなたの場合に私が提案するのは、 test.conf Play for testモードを実行しているとき(例:

play -Dconfig.file=conf/test.conf

その後、 test.conf ピックアップされます。その後、通常の内容を含めることもできます application.conf モンゴの設定だけをオーバーライドします。

おそらく、「シングルターゲットモード」をデフォルトのmongodbへの接続方法にすることも理にかなっています。 application.conf、およびmongob構成を上書きして、実稼働構成でのみレプリカセットを使用します。