2015-12-04 13 views
5

Tôi tự hỏi cách kinh điển là thử nghiệm xem một diễn viên đã dừng lại trong akka. Đây là một ví dụ về cách tôi hiện đang làm; Tôi lo rằng tôi sẽ làm phức tạp hơn.akka: làm thế nào để kiểm tra rằng một diễn viên đã được dừng lại

import akka.actor.{Terminated, Actor, Props, ActorSystem} 
import akka.testkit.TestProbe 

class MyActor extends Actor { 
    import MyActor._ 
    override def receive: Receive = { 
    case Stop => context.stop(self) 
    } 
} 

object MyActor { 
    def props = Props(new MyActor) 
    case object Stop 
} 


object MyActorSpec { 

    val system = ActorSystem() 
    val myActor = system.actorOf(MyActor.props) 
    val testProbe = TestProbe() 

    case object MyActorStopped 

    val watcher = system.actorOf(Props(new Actor { 
    context.watch(myActor) 
    override def receive: Actor.Receive = { 
     case Terminated(`myActor`) => testProbe.ref ! MyActorStopped 
    } 
    })) 

    myActor ! MyActor.Stop 
    testProbe.expectMsg(MyActorStopped) 
} 

Trả lời

17

Bạn có thể thoát khỏi những diễn viên watcher riêng biệt, và chỉ cần xem các diễn viên mục tiêu trực tiếp từ các diễn viên testProbe:

val testProbe = TestProbe() 
testProbe watch myActor 
myActor ! MyActor.Stop 
testProbe.expectTerminated(myActor) 

Xem here cho phần có liên quan của các tài liệu thử nghiệm Akka.

+0

Tuyệt vời - Tôi đã hy vọng một điều như thế này. Không chắc chắn làm thế nào tôi bỏ lỡ nó Cheers. – Mullefa

+0

Cũng muốn thêm, khi khó có được 'ActorRef' để chuyển sang phương thức' expectTerminated() ', ví dụ: ref đã được tạo dưới dạng con của một diễn viên khác, tôi thấy hữu ích khi thu thập ref đã bị dừng và thực hiện kiểm tra trên ví dụ: tên của nó: 'val msg = testProbe.expectMsgType [Terminated]; assert (msg.actor.path.name == "myActor") ' – Mullefa

+0

Có điều gì sai khi sử dụng testActor thay vì testProbe không? 'this watch myActor' ' myActor! MyActor.Stop' 'expectTerminated (myActor)' –

Các vấn đề liên quan