2015-07-13 1 views
2

J'ai conçu un acteur qui devrait envoyer son actorRef à un autre acteur sur prédémarrage:ActorRef a-t-il obtenu via system.actorOf une valeur égale à lui-même dans cet acteur?

class MyActor(notifier: ActorRef) extends Actor { 
    override def preStart(): Unit = { 
    notifier ! Register(self) 
    } 
    ... 
} 

case class Register(actor: ActorRef) 

J'ai écrit un cahier des charges pour cet acteur:

class MyActorSpec extends TestKit(ActorSystem("MyActorSpec")) 
        with ImplicitSender 
        with WordSpecLike 
        with Matchers 
        with BeforeAndAfterAll { 

    "MyActor" should { 
    val notifier = TestProbe() 
    "register itself in notifier" in { 
     val myActor = system.actorOf(Props(classOf[MyActor], notifier.ref)) 
     notifier.expectMsg(Register(myActor)) 
    } 
    } 
} 

Quand je lance mon test , il échoue avec le message suivant: assertion failed: expected Register(Actor[akka://MyActorSpec/user/$b#1849780829]), found Register(Actor[akka://MyActorSpec/user/$a#1143150267])

, il semble donc que ActorRef obtenu par self à l'intérieur MyActor n'est pas égal à ActorRef obtenu par system.actorOf dans mon test. Aucune suggestion?

Répondre

0

Je l'ai compris. C'est parce que j'ai utilisé TestProbe partagé dans plusieurs cas de test, dans lesquels je crée différentes instances de MyActor. Au lieu de cela, en utilisant une nouvelle instance de TestProbe pour chaque cas de test, vous avez aidé. Quoi qu'il en soit, merci à tous pour avoir prouvé que pour un cas de test unique, cela fonctionne bien.

1

Le code suivant fonctionne très bien pour moi (le test passe):

class MyActor(notifier: ActorRef) extends Actor { 
    override def preStart(): Unit = { 
    notifier ! Register(self) 
    } 

    override def receive: Receive = { 
    case _ => 
    } 
} 

case class Register(actor: ActorRef) 

class MyActorSpec extends TestKit(ActorSystem("MyActorSpec")) with ImplicitSender with WordSpecLike with Matchers with BeforeAndAfterAll { 
    "MyActor" should { 
    val notifier = TestProbe() 
    "register itself in notifier" in { 
     val myActor = system.actorOf(Props(new MyActor(notifier.ref))) 
     notifier.expectMsg(Register(myActor)) 
    } 
    } 
} 
1

Le code affiché devrait idéalement même pas compiler à:

val myActor = system.actorOf(Props(classOf[MyActor], notifier)) 

Parce que le constructeur attend un ActorRef que nous ne passons pas. Mais la corriger, cela fonctionne:

class MyActorSpec extends TestKit(ActorSystem("MyActorSpec")) 
with ImplicitSender 
with WordSpecLike 
with Matchers 
with BeforeAndAfterAll { 

    "MyActor" should { 
    val notifier = TestProbe() 
    "register itself in notifier" in { 
     val myActor = system.actorOf(Props(classOf[MyActor], notifier.ref)) 
     notifier.expectMsg(Register(myActor)) 
    } 
    } 
} 

Pour une seconde, juste pour se assurer qu'il n'y a rien de magique qui se passe à cause de ActorProbe, j'ai écrit classe vieux acteur plaine. Il imprime true. Donc, il n'y a rien de mal avec votre programme.

+0

Oui, il y avait effectivement notifier.ref dans ma question, je l'ai corrigé. –