我正在使用specs2库执行单元测试。目前我正在使用ForEach上下文将我的数据库注入到单元测试中,如下例所示:
trait DatabaseContext extends ForEach[Transaction] {
// you need to define the "foreach" method
def foreach[R: AsResult](f: Transaction => R): Result = {
val transaction = openDatabaseTransaction
try AsResult(f(transaction))
finally closeDatabaseTransaction(transaction)
}
// create and close a transaction
def openDatabaseTransaction: Transaction = ???
def closeDatabaseTransaction(t: Transaction) = ???
}
这种方法让我像这样编写测试:
"test 1" >> { t: Transaction =>
println("use the transaction")
ok
}
我的问题是我的测试中还需要ExecutionEnv
,因为我正在使用specs2
未来的匹配器预期。
"test 1" >> { implicit env: ExecutionEnv =>
Future(1) must be_==( 0 ).await
}
如何组合这两种方法,以便我可以使用ForEach访问测试中的执行环境? 我已经尝试过使用这段代码,但它没有编译
"test 1" >> { implicit env: ExecutionEnv =>
new DatabaseContext { t: Transaccion =>
myFuture must be_==( "some result" ).await
}
}
我会感激任何建议。 非常感谢你们
答案 0 :(得分:2)
使用最新版本的specs2(3.6.5是最新版本),您只需"inject" the execution environment as a class member:
class MySpec(implicit ee: ExecutionEnv) extends Specification {
...
}
然后您可以像以前一样使用DatabaseContext
。
答案 1 :(得分:0)
你应该能够以这种方式将它们连在一起:
"test with env and transaction" >> { implicit env: ExecutionEnv => t:Transaction =>
Future(1) must be_==( 0 ).await
println("use the transaction")
ok
}