10

以下のアクターが heartBeatExpireWorker と heartBeatAccepter を作成していることを確認するテストを作成しようとしていますが、その方法がわかりません。

最初に、コンテキストの代わりに Mockhito モックまたはスパイを使用して、actorOf を呼び出したことを確認できると考えていましたが、Akka のテスト フレームワークを壊さずにコンテキストを挿入する方法がわかりません。

次に、識別メッセージをワーカーに送信して、ワーカーが存在することを確認できると考えていました。しかし、Akka TestKit はテスト対象のアクターの子アクターを作成しないように見えるため、それもうまくいかないことに気付きました。隣接するアクターの代わりになることができるテストプローブのみを取り込むことができます。

class HeartBeatPumpWorker(chatService: ChatService, target: HeartBeatMessageCmd) extends Actor with ActorLogging with
WorkersReference {

  val heartBeatInterval = chatService.getHeartBeatInterval

  val tick = context.system.scheduler.schedule(0 millis, heartBeatInterval millis, self, SendHeartBeat(target))

  override def postStop() = tick.cancel()

  def receive = {
    case SendHeartBeat(command: HeartBeatMessageCmd) =>
      log.debug("Sending heartbeat")
      //Send heartbeat to GWT
      val userTarget = NetworkWorker.buildEventUserTarget(command.getEventCode, command.getUser)

      val uuid: String = UUID.randomUUID().toString
      val freshCommand = new HeartBeatMessageCmd(command.getUser, command.getEventCode, uuid, command.getUserSession)
      networkWorker ! NetworkBroadcast(userTarget, freshCommand)

      val heartBeatId: String = freshCommand.getUuid
      //create expirer
      val heartBeatExpireWorkerRef = context.actorOf(HeartBeatExpireWorker.props(chatService, freshCommand),
        HeartBeatExpireWorker.name(heartBeatId))
      val heartBeatAccepterRef = context
        .actorOf(HeartBeatAcceptWorker.props(chatService, freshCommand), HeartBeatAcceptWorker.name(heartBeatId))

      //record heartbeat
        chatService.saveSentHeartbeat(heartBeatId, freshCommand.getUserSession, freshCommand.getEventCode,
          freshCommand.getUser,
        freshCommand.getTimeCmdGenerated)
    case _ =>
      log.error("Pumper received unknown message.  This shouldn't happen " + sender.path.toString)
      self ! PoisonPill
  }

}


object HeartBeatPumpWorker {
  def name(eventCode: String, user: String, sessionId: String) = f"HeartBeatPumpWorker-$eventCode-$user-$sessionId"

  def path(eventCode: String, user: String, sessionId: String) : String = {
    EventWorker.Path + "/" + name(eventCode, user, sessionId)
  }

  def props(chatService: ChatService, heartBeatMsgCmd: HeartBeatMessageCmd) = {
    Props(classOf[HeartBeatPumpWorker], chatService, heartBeatMsgCmd)
  }
}
4

2 に答える 2

3

親のコンストラクターでProps子 (例) に注入します。テストから必要なものをすべて渡します。親が provided を介して子をインスタンス化できるようにします。子供たちと交流します。最後の部分は、データ フローに依存します。たとえば、親が子供からあなたを保護しているが、メッセージを委任している場合は、メッセージを親に送信します。子供たちがお互いに話す場合は、テスト プローブまたは類似のものを使用します。HeartBeatAcceptWorker.propsHeartBeatPumpWorkerPropsProps

于 2013-09-04T07:42:51.357 に答える