Typed testkit: Adding proper NoEffects assertions (#25062)

* Adding proper NoEffects assertions
* Added NoEffects trait for expectations by type
This commit is contained in:
Vasin Ilya 2018-05-21 10:59:34 +03:00 committed by Christopher Batey
parent eef58946d7
commit 7d0eed0631
3 changed files with 29 additions and 4 deletions

View file

@ -69,13 +69,14 @@ private[akka] final class BehaviorTestKitImpl[T](_path: ActorPath, _initialBehav
override def expectEffect(expectedEffect: Effect): Unit = { override def expectEffect(expectedEffect: Effect): Unit = {
ctx.effectQueue.poll() match { ctx.effectQueue.poll() match {
case null throw new AssertionError(s"expected: $expectedEffect but no effects were recorded") case null assert(expectedEffect == NoEffects, s"expected: $expectedEffect but no effects were recorded")
case effect assert(expectedEffect == effect, s"expected: $expectedEffect but found $effect") case effect assert(expectedEffect == effect, s"expected: $expectedEffect but found $effect")
} }
} }
def expectEffectClass[E <: Effect](effectClass: Class[E]): E = { def expectEffectClass[E <: Effect](effectClass: Class[E]): E = {
ctx.effectQueue.poll() match { ctx.effectQueue.poll() match {
case null if effectClass.isAssignableFrom(NoEffects.getClass) effectClass.cast(NoEffects)
case null throw new AssertionError(s"expected: effect type ${effectClass.getName} but no effects were recorded") case null throw new AssertionError(s"expected: effect type ${effectClass.getName} but no effects were recorded")
case effect if effectClass.isAssignableFrom(effect.getClass) effect.asInstanceOf[E] case effect if effectClass.isAssignableFrom(effect.getClass) effect.asInstanceOf[E]
case other throw new AssertionError(s"expected: effect class ${effectClass.getName} but found $other") case other throw new AssertionError(s"expected: effect class ${effectClass.getName} but found $other")
@ -84,7 +85,8 @@ private[akka] final class BehaviorTestKitImpl[T](_path: ActorPath, _initialBehav
def expectEffectPF[R](f: PartialFunction[Effect, R]): R = { def expectEffectPF[R](f: PartialFunction[Effect, R]): R = {
ctx.effectQueue.poll() match { ctx.effectQueue.poll() match {
case null throw new AssertionError(s"expected matching effect but no effects were recorded") case null if f.isDefinedAt(NoEffects)
f.apply(NoEffects)
case eff if f.isDefinedAt(eff) case eff if f.isDefinedAt(eff)
f.apply(eff) f.apply(eff)
case other case other

View file

@ -137,5 +137,10 @@ object Effects {
/** /**
* Used to represent an empty list of effects - in other words, the behavior didn't do anything observable * Used to represent an empty list of effects - in other words, the behavior didn't do anything observable
*/ */
case object NoEffects extends Effect case object NoEffects extends NoEffects
/**
* Used for NoEffects expectations by type
*/
sealed trait NoEffects extends Effect
} }

View file

@ -7,7 +7,7 @@ package akka.testkit.typed.scaladsl
import akka.Done import akka.Done
import akka.actor.typed.scaladsl.Behaviors import akka.actor.typed.scaladsl.Behaviors
import akka.actor.typed.{ ActorRef, Behavior, Props } import akka.actor.typed.{ ActorRef, Behavior, Props }
import akka.testkit.typed.scaladsl.Effects.{ Spawned, SpawnedAdapter, SpawnedAnonymous, SpawnedAnonymousAdapter, Watched, Unwatched } import akka.testkit.typed.scaladsl.Effects.{ NoEffects, Spawned, SpawnedAdapter, SpawnedAnonymous, SpawnedAnonymousAdapter, Unwatched, Watched }
import akka.testkit.typed.scaladsl.BehaviorTestKitSpec.{ Child, Father } import akka.testkit.typed.scaladsl.BehaviorTestKitSpec.{ Child, Father }
import akka.testkit.typed.scaladsl.BehaviorTestKitSpec.Father._ import akka.testkit.typed.scaladsl.BehaviorTestKitSpec.Father._
import org.scalatest.{ Matchers, WordSpec } import org.scalatest.{ Matchers, WordSpec }
@ -114,6 +114,16 @@ class BehaviorTestKitSpec extends WordSpec with Matchers {
spawnAnonymous.props should ===(Props.empty) spawnAnonymous.props should ===(Props.empty)
} }
"allow expecting NoEffects by type" in {
val testkit = BehaviorTestKit[Father.Command](Father.init)
testkit.expectEffectType[NoEffects]
}
"allow expecting NoEffects" in {
val testkit = BehaviorTestKit[Father.Command](Father.init)
testkit.expectEffect(NoEffects)
}
"return if effects have taken place" in { "return if effects have taken place" in {
val testkit = BehaviorTestKit[Father.Command](Father.init) val testkit = BehaviorTestKit[Father.Command](Father.init)
testkit.hasEffects() should ===(false) testkit.hasEffects() should ===(false)
@ -140,6 +150,14 @@ class BehaviorTestKitSpec extends WordSpec with Matchers {
} }
childName should ===("child0") childName should ===("child0")
} }
"allow assertions using partial functions - match on NoEffect" in {
val testkit = BehaviorTestKit[Father.Command](Father.init)
val hasEffects = testkit.expectEffectPF {
case NoEffects false
}
hasEffects should ===(false)
}
} }
"BehaviorTestkit's spawn" must { "BehaviorTestkit's spawn" must {