=doc #13043 Adding section on testing parent-child relationships
This commit is contained in:
parent
f2f88d9dd7
commit
dd8c920280
4 changed files with 446 additions and 0 deletions
135
akka-docs/rst/scala/code/docs/testkit/ParentChildSpec.scala
Normal file
135
akka-docs/rst/scala/code/docs/testkit/ParentChildSpec.scala
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
package docs.testkit
|
||||
|
||||
import org.scalatest.WordSpec
|
||||
import org.scalatest.Matchers
|
||||
import akka.testkit.TestKitBase
|
||||
import akka.actor.ActorSystem
|
||||
import akka.actor.Props
|
||||
import akka.actor.Actor
|
||||
import akka.actor.ActorRef
|
||||
import akka.testkit.ImplicitSender
|
||||
import akka.testkit.TestProbe
|
||||
import akka.testkit.TestActorRef
|
||||
import akka.actor.ActorRefFactory
|
||||
|
||||
/**
|
||||
* Parent-Child examples
|
||||
*/
|
||||
|
||||
//#test-example
|
||||
class Parent extends Actor {
|
||||
val child = context.actorOf(Props[Child], "child")
|
||||
var ponged = false
|
||||
|
||||
def receive = {
|
||||
case "pingit" => child ! "ping"
|
||||
case "pong" => ponged = true
|
||||
}
|
||||
}
|
||||
|
||||
class Child extends Actor {
|
||||
def receive = {
|
||||
case "ping" => context.parent ! "pong"
|
||||
}
|
||||
}
|
||||
//#test-example
|
||||
|
||||
//#test-dependentchild
|
||||
class DependentChild(parent: ActorRef) extends Actor {
|
||||
def receive = {
|
||||
case "ping" => parent ! "pong"
|
||||
}
|
||||
}
|
||||
//#test-dependentchild
|
||||
|
||||
//#test-dependentparent
|
||||
class DependentParent(childProps: Props) extends Actor {
|
||||
val child = context.actorOf(childProps, "child")
|
||||
var ponged = false
|
||||
|
||||
def receive = {
|
||||
case "pingit" => child ! "ping"
|
||||
case "pong" => ponged = true
|
||||
}
|
||||
}
|
||||
|
||||
class GenericDependentParent(childMaker: ActorRefFactory => ActorRef) extends Actor {
|
||||
val child = childMaker(context)
|
||||
var ponged = false
|
||||
|
||||
def receive = {
|
||||
case "pingit" => child ! "ping"
|
||||
case "pong" => ponged = true
|
||||
}
|
||||
}
|
||||
//#test-dependentparent
|
||||
|
||||
/**
|
||||
* Test specification
|
||||
*/
|
||||
|
||||
class MockedChild extends Actor {
|
||||
def receive = {
|
||||
case "ping" => sender ! "pong"
|
||||
}
|
||||
}
|
||||
|
||||
class ParentChildSpec extends WordSpec with Matchers with TestKitBase {
|
||||
implicit lazy val system = ActorSystem()
|
||||
|
||||
"A DependentChild" should {
|
||||
"be tested without its parent" in {
|
||||
val probe = TestProbe()
|
||||
val child = system.actorOf(Props(classOf[DependentChild], probe.ref))
|
||||
probe.send(child, "ping")
|
||||
probe.expectMsg("pong")
|
||||
}
|
||||
}
|
||||
|
||||
"A DependentParent" should {
|
||||
"be tested with custom props" in {
|
||||
val probe = TestProbe()
|
||||
val parent = TestActorRef(new DependentParent(Props[MockedChild]))
|
||||
probe.send(parent, "pingit")
|
||||
// test some parent state change
|
||||
parent.underlyingActor.ponged should (be(true) or be(false))
|
||||
}
|
||||
}
|
||||
|
||||
"A GenericDependentParent" should {
|
||||
"be tested with a child probe" in {
|
||||
val probe = TestProbe()
|
||||
//#child-maker-test
|
||||
val maker = (_: ActorRefFactory) => probe.ref
|
||||
val parent = system.actorOf(Props(classOf[GenericDependentParent], maker))
|
||||
//#child-maker-test
|
||||
probe.send(parent, "pingit")
|
||||
probe.expectMsg("ping")
|
||||
}
|
||||
|
||||
"demonstrate production version of child creator" in {
|
||||
//#child-maker-prod
|
||||
val maker = (f: ActorRefFactory) => f.actorOf(Props[Child])
|
||||
val parent = system.actorOf(Props(classOf[GenericDependentParent], maker))
|
||||
//#child-maker-prod
|
||||
}
|
||||
}
|
||||
|
||||
//#test-fabricated-parent
|
||||
"A fabricated parent" should {
|
||||
"test its child responses" in {
|
||||
val proxy = TestProbe()
|
||||
val parent = system.actorOf(Props(new Actor {
|
||||
val child = context.actorOf(Props[Child], "child")
|
||||
def receive = {
|
||||
case x if sender == child => proxy.ref forward x
|
||||
case x => child forward x
|
||||
}
|
||||
}))
|
||||
|
||||
proxy.send(parent, "ping")
|
||||
proxy.expectMsg("pong")
|
||||
}
|
||||
}
|
||||
//#test-fabricated-parent
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue