Тест Scala, как получить результат от актера

#scala #akka #scalatest

#scala #akka #scalatest

Вопрос:

у меня проблема. Я пытаюсь выполнить несколько тестов scala. Моя проблема в том, что я не знаю, как принять возврат метода, чтобы проверить, возвращает ли он мне последовательность или нет. Как я могу это сделать? Мой тестовый класс: (он работает)

 "The game actor" should {

    "accept a specific numbers of players and notify that the game is started with an initial state" in {
      val gameActor = TestActorRef[GameMatchActor](GameMatchActor.props(NUMBER_OF_PLAYERS))
      val player1 = TestProbe()
      val player2 = TestProbe()

      gameActor ! GamePlayers(Seq(GamePlayer("id1", "player1", player1.ref), GamePlayer("id2", "player2", player2.ref)))
      player1.expectMsgType[MatchFound]
      player1.send(gameActor, PlayerReadyServer("id1", player1.ref))
      player2.expectMsgType[MatchFound]
      player2.send(gameActor, PlayerReadyServer("id2", player2.ref))

      player1.expectMsgType[GamePlayersClient]
      player2.expectMsgType[GamePlayersClient]

    }
  }
 

И метод, который возвращает мне GamePlayersClient,:

 private def defineRoles(players: Seq[GamePlayer]): Seq[Player] = {
    var playersRole: Seq[Player] = Seq()
    val rand1 = Random.nextInt(players.length)
    val rand2 = Random.nextInt(players.length)

    for (n <- 0 until players.length) {
      n match {
        case n if n == rand1 || n == rand2 =>
          playersRole = playersRole :  Impostor(players(n).id, players(n).username, Point2D(0,0))
        case _ => playersRole = playersRole :  Crewmate(players(n).id, players(n).username, Point2D(0,0))
      }
    }
    playersRole
  }
 

И:

 // watch the players with the new actor ref
    val playersRole = defineRoles(players)
    this.players.foreach(p => {
      p.actorRef ! GamePlayersClient(playersRole)
      context.watch(p.actorRef)
    })
 

Итак, как я могу взять GamePlayersClient (playersRole) и выполнить поиск, если внутри есть последовательность игроков, и один из них является «Членом экипажа». Спасибо

Ответ №1:

Вы можете использовать один из методов receive TestProbe для сбора GamePlayersClient сообщений, отправленных на зонд, а затем использовать сопоставители ScalaTest для утверждения информации об этих сообщениях.

Например, вы могли бы заменить

 player1.expectMsgType[GamePlayersClient]
 

с

 val gpcMessageOpt1: Option[GamePlayersClient] = Option(player1.receiveN(1)).flatMap {
  case g: GamePlayersClient => Some(g)
  case _ => None
}

gpcMessageOpt1 shouldNot be(empty) // effectively the same as the expectMessage
 

Если область интересов playersRole , то у вас может быть

 // To my mind, it's generally OK to do unsafe things like get in a test...
gpcMessageOpt1.get.playersRole shouldNot be(empty)