Skip to content

Instantly share code, notes, and snippets.

@vijaykiran
Forked from archie/ParentChild.scala
Created June 17, 2014 09:47
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vijaykiran/eca79ed3ba8c88bda3b9 to your computer and use it in GitHub Desktop.
Save vijaykiran/eca79ed3ba8c88bda3b9 to your computer and use it in GitHub Desktop.
package pc
import akka.actor.Actor
import akka.actor.Props
import akka.actor.ActorRef
import akka.actor.ActorRefFactory
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
}
}
class DependentChild(parent: ActorRef) extends Actor {
def receive = {
case 'ping => parent ! 'pong
}
}
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
}
}
package pc
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.testkit.ImplicitSender
import akka.testkit.TestProbe
import akka.testkit.TestActorRef
import akka.actor.ActorRefFactory
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()
val maker = (_: ActorRefFactory) => probe.ref
val parent = system.actorOf(Props(classOf[GenericDependentParent], maker))
probe.send(parent, 'pingit)
probe.expectMsg('ping)
}
}
"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)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment