9

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

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

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

クリス

4

5 に答える 5

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で実行しています。

于 2013-10-04T14:57:54.050 に答える
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
   }
 }
}
于 2012-11-15T09:29:27.867 に答える
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))
    
于 2014-12-08T02:12:36.017 に答える
1

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

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

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

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

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

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

@RunWith(classOf[JUnitRunner])
class ApplicationTest extends FunSuite with MockitoSugar {
   System.setProperty("config.resource", "test.conf")
   val app = Helpers.fakeApplication()
}
于 2015-07-03T19:11:15.630 に答える
0

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

あなたの場合に私が提案するのは、test.confたとえば次のように、テストモードでPlayを実行するときにを指定することです。

play -Dconfig.file=conf/test.conf

その後test.conf、ピックアップされます。次に、通常の設定を含めてapplication.conf、mongo設定のみをオーバーライドすることもできます。

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

于 2012-10-25T06:50:46.530 に答える