具有执行环境的 Specs2 ForEach 上下文

Specs2 ForEach context with execution env

我正在使用 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
    }
}

如果有任何建议,我将不胜感激。 非常感谢大家

您应该能够以这种方式将它们链接在一起:

  "test with env and transaction" >> { implicit env: ExecutionEnv => t:Transaction =>
    Future(1) must be_==( 0 ).await
    println("use the transaction")
    ok
  }

使用最新版本的 specs2(3.6.5 是最新版本),您可以简单地 "inject" the execution environment as a class member:

class MySpec(implicit ee: ExecutionEnv) extends Specification {
  ...
}

然后您可以像以前一样使用您的 DatabaseContext