cma*_*her 9 scala mongodb specs2 playframework-2.0
我有一个specs2测试,它使用FakeApplication和一个嵌入式mongodb数据库.
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
}
}
Run Code Online (Sandbox Code Playgroud)
FakeApplication使用conf目录中的默认application.conf配置以及为每个测试创建的测试数据库的其他配置.
直到我们设置了一个mongodb replicat集,这才有效.现在,application.conf包含此replicat集的配置
mongodb.default.replicaset {
host1.host = "localhost"
host1.port = 27017
host2.host = "localhost"
host2.port = 27018
host3.host = "localhost"
host3.port = 27019
}
Run Code Online (Sandbox Code Playgroud)
由于FakeApplication使用默认配置,因此测试失败,因为无法找到replicaset的主机.我希望为我的测试配置不同的配置,基本上删除mongodb.default.replicaset条目.如果mongodb.default.replicaset是一个简单的Map [String,String],那将很容易,因为我可以将它添加到additonalConfiguration但是当我尝试这样做时它会失败,因为期望的值类型不是String而是Object.我还尝试通过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
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它没有加载任何配置.
我非常感谢任何帮助.谢谢.
克里斯
小智 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);
}
});
}
Run Code Online (Sandbox Code Playgroud)
我不知道Scala方面是否有一个很好的方法,我们在java中完成所有代码.
问题是在使用 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
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12444 次 |
| 最近记录: |