6

Akka の TestKit を使用して specs2 テストを作成しようとしています。解決方法がわからない永続的なコンパイル エラーで立ち往生しています。提案をいただければ幸いです。

コンパイルエラーは次のとおりです。

TaskSpec.scala:40: parents of traits may not have parameters
[error]   with akka.testkit.TestKit( ActorSystem( "testsystem", ConfigFactory.parseString( TaskSpec.config ) ) )

Akka docsと Internet xebiaと Akka in Actionからの提案に従って、TestKit を specs2 Scope に組み込んでみます。エラーが発生しているコードのスニペットを次に示します。

class TaskSpec 
extends Specification 
with AsyncTest
with NoTimeConversions { 

  sequential 

  trait scope 
  extends Scope 
  with TestKit( ActorSystem( "testsystem", ConfigFactory.parseString( TaskSpec.config ) ) ) 
  with AkkaTestSupport {
...

次のヘルパーがあります。

trait AkkaTestSupport extends After { outer: TestKit =>
  override protected def after: Unit = {
    system.shutdown()
    super.after
  }
}
4

1 に答える 1

6

ここでできることの1つは次のとおりです。

import org.specs2.mutable.SpecificationLike
import org.specs2.specification._

class TestSpec extends Actors { isolated
  "test1" >> ok
  "test2" >> ok
}

abstract class Actors extends 
 TestKit(ActorSystem("testsystem", ConfigFactory.parseString(TaskSpec.config)))
 with SpecificationLike with AfterExample {

  override def map(fs: =>Fragments) = super.map(fs) ^ step(system.shutdown, global = true)

  def after = system.shutdown
}

TestKitは抽象クラスであり、特性を混合しているだけなのでSpecificationLike、これはコンパイル エラーを回避するはずです。SpecificationAfterExample

また、上記の仕様はisolatedモードで実行されます。つまり、サンプルごとにインスタンス化された真新しいTestSpecオブジェクトがあり、AfterExampleトレイトは各サンプルの後にシステムがシャットダウンされることを確認します。

最後に、mapメソッドは特別なものでオーバーライドstepsystemれ、最初のTestSpecインスタンス (すべての例を宣言するもの) 用に作成されたものがきれいに破棄されるようにします。

于 2013-11-12T00:38:54.740 に答える