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

时间:2015-11-25 20:38:03

标签: scala unit-testing specs2

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

我会感激任何建议。 非常感谢你们

2 个答案:

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