测试Actor preStart()

时间:2015-03-15 18:11:38

标签: scala akka reactivemongo

我从Casbah搬到了Reactive Mongo,从那一刻起,我无法将工作作为我演员的考验。

我有一个dao用于持久层并测试该层。所有测试都通过了。所以,我唯一想到的是同步问题。

" UserActor " should {

val socketActorProbe = new TestProbe(system)
val peyiProbe = new TestProbe(system)
val identifyId = 1

val emailCsr = "csr@gmail.com"
val emailPeyi = "peyi@gmail.com"

val point = new Point[LatLng](new LatLng(-31.4314041, -64.1670626))

" test preStart() " in new WithApplication {

  db.createDB(id1, id2, id3)

  val userActorRefCsr = TestActorRef[UserActor](Props(classOf[UserActor], emailCsr, socketActorProbe.ref))
  val csr = userActorRefCsr.underlyingActor

  val userActorRef = TestActorRef[UserActor](Props(classOf[UserActor], emailPeyi, socketActorProbe.ref))
  val peyi = userActorRef.underlyingActor

  peyi.receive(ActorIdentity(identifyId, Option(userActorRefCsr)))

  db.clearDB()
}

演员班。

class UserActor(email: String, upstream: ActorRef) extends Actor {

  import UserActor._

  val identifyId = 1

  val usersFromDB = ReactiveMongoFactory.db.collection[BSONCollection]("users")
  val userDao = new UserDao(usersFromDB)

  val meFuture = userDao.findMeByEmail(email)
  var friends: Map[String, ActorRef] = Map()

  override def preStart() = {

    meFuture onComplete { result =>

      val emailsFriends: List[String] = userDao.getMyFriendsEmail(result.get.get)

      println(emailsFriends)

      for (email <- emailsFriends) {
        println("sending msg to " + email)
        context.actorSelection("/user/" + email) ! Identify(identifyId)
      }
    }
  }

  private def giveMyFriend(email: String): Option[ActorRef] = {
    for(friend <- friends){
      if (friend._1 == email) new Some(friend._2)
    }
    None
  }

  def active(another: ActorRef): Actor.Receive = {
    case Terminated(`another`) => context.stop(self)
  }

  def receive = {

    case ActorIdentity(`identifyId`, Some(actorRef)) =>

      meFuture onComplete { result =>
        println(" ... subscribing ... " + result.get.get.basicProfile.email)
        actorRef ! Subscribe(result.get.get.basicProfile.email.get)
        context.watch(actorRef)
        context.become(active(actorRef))
      }

    case Subscribe(email) =>
      friends += (email -> sender)
      context watch sender

    case Terminated(user) => {
      for(friend <- friends){
       if (friend._2 == user ) friends -= friend._1 //removing by key
      }
    }

    case UserMoved(email, point) =>
      upstream ! UserPosition(email, System.currentTimeMillis(), point.coordinates)
  }
}

Im receiving the following output.

Test Output

The exception is thrown in the following lines of code.

    def findMeByEmail(email: String): Future[Option[User]] = {
    val query = BSONDocument("email" -> email)
    println( " .... finding user ..... email: " + email )
    val cursor = users.find(query).cursor[BSONDocument]

    val userFuture = cursor.headOption.map(
      doc => Some(userReader.read(doc.get))
    )
    userFuture
  }

如果我为该方法运行测试,那一切都没问题。

describe("get my friends emails") {
  it("returns a list of emails") {
    val futureUser = userDao.findMeByEmail("csr@gmail.com")
    ScalaFutures.whenReady(futureUser) { result =>
      val friends = userDao.getMyFriendsEmail(result.get)
      assert(friends.length == 2)
    }
  }
}

Test of get my friends emails

基本上,我试图看看我的朋友(其他演员),然后在地图中注册它们以获得参考。我找不到任何一个很好的例子来展示使用Reactive Mongo和Actors的测试。

我希望有人能帮我理解这里发生的事情。提前谢谢。

0 个答案:

没有答案