2016-03-04 70 views
0

我想测试一个演员,这取决于另一个演员。在以下测试中,ActorAMessageA发送到ActorB,并且期望返回MessageB用TestKit测试嘲笑的演员的期望消息

由于这是一个单元测试ActorB,我嘲笑ActorA。我现在的问题是,我想确保ActorA获得MessageA,但是当我打电话给expectMsg(请参阅注释行),整个自动驾驶仪似乎不再工作。

我在这里做错了什么?

class MyTest(_system: ActorSystem) extends TestKit(_system) 
    with WordSpecLike 
    with BeforeAndAfterAll { 

    object Start 
    object MessageA 
    object MessageB 

    def this() = this(ActorSystem("TestSpec")) 

    override def afterAll() { 
    system.shutdown() 
    } 

    // will later be mocked 
    class ActorA extends Actor { 
    def receive = { 
     case MessageA => sender() ! MessageB 
    } 
    } 

    class ActorB(actorA: ActorRef) extends Actor { 
    def receive = { 
     case Start => actorA ! MessageA 
     case MessageB => println("Got MessageB") 
    } 
    } 

    "" should { 
    "work" in { 
     val actorA = TestProbe() 

     actorA.setAutoPilot(new AutoPilot { 
     override def run(sender: ActorRef, msg: Any): AutoPilot = { 
      msg match { 
      case MessageA => sender ! MessageB 
      } 
      TestActor.KeepRunning 
     } 
     }) 

     // this will break the test 
     //actorA.expectMsg(MessageA) 

     val actor = system.actorOf(Props(new ActorB(actorA.ref))) 
     actor ! Start 
    } 
    } 

} 

回答

0

发送开始到你的ActorB后,你应该期待MessageA。

val actor = system.actorOf(Props(new ActorB(actorA.ref))) 
    actor ! Start 

    // this will not break the test 
    actorA.expectMsg(MessageA)