【问题标题】:Test response from child on akka孩子对akka的测试响应
【发布时间】:2014-11-03 20:03:07
【问题描述】:

我是在 akka 系统上使用 scala 的新手。

我有一个父actor(名为“manager”),它向一个孩子发送消息,并收到一个答案,然后转发给下一个孩子。 最终actor保存整个过程的结果。

我想创建一个端到端的测试,它向父级(“经理”)发送一条消息,并期待来自最后一个接收结果的参与者的消息。 我正在寻找一种简单的方法来指导最终参与者将消息发送回测试。由于测试不是发送者,也不是简单的参与者,所以我不知道如何正确引导消息。

以下是测试代码:

class EndToEndTest extends TestKit(ActorSystem("MyActorSystem"))
with FunSuiteLike with Matchers with BeforeAndAfterAll with ImplicitSender {

  override def afterAll {
      TestKit.shutdownActorSystem(system)
  }

  test("should send result") {

  val actor = system.actorOf(Props(new Manager(name = "ActorManager")))
  actor ! tPoint(1000L)
  actor ! tPoint(2000L)

  expectMsg(ActorResult(1)) 
  }
}

最后一个儿童演员:

class SensorHealthReportMySqlActor extends Actor with ActorLogging {

   def receive = {
      case Result(result: Long) =>

         //this is where i would like to send the test a message with  Result(result)

      case _ =>
           log.error("Unknown message type")
   }

}

任何帮助将不胜感激。

【问题讨论】:

    标签: scala unit-testing akka


    【解决方案1】:

    我认为您想要的解决方案是将ActorRef 作为消息中的参数传递,以便接收者知道在应该将消息发送给当前消息的发送者以外的某个参与者时将回复发送到哪里。

    所以大致如下:

    import akka.actor.{Actor, Props, ActorRef, ActorLogging}
    
    case class tPoint(n: Long)
    case class Result(result: Long, replyTo: ActorRef)
    case class ActorResult(result: Long)
    
    class Manager(name: String) extends Actor {
    
      val child = context.actorOf(Props(new SensorHealthReportMySqlActor))
    
      override def receive: Receive = {
        case msg: tPoint ⇒
          child ! Result(msg.n, sender())
      }
    }
    
    
    
    class SensorHealthReportMySqlActor extends Actor with ActorLogging {
    
      def receive = {
        case Result(result: Long, replyTo: ActorRef) =>
          //this is where i would like to send the test a message with  Result(result)
          replyTo ! ActorResult(1)
    
        case _ =>
          log.error("Unknown message type")
      }
    
    }
    

    在这种情况下,Manager receive 方法中的 sender() 是测试本身,它是 ImplicitSender(正如您在测试中声明的那样)。这是一个在幕后创建的可以接收消息的actor。

    在非测试系统中,您可以将ask 模式或Inbox 用于相同目的。请参阅Actors 的文档。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-17
      • 1970-01-01
      • 1970-01-01
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 2020-01-24
      • 2019-06-27
      相关资源
      最近更新 更多