2015-10-21 31 views
1

我想測試我與Scaldi玩2.4的應用程序中的演員A。這位演員打電話給injectActorRef[B],我想嘲笑TestKit.TestProbeScaldi:綁定[T <AkkaInjectable]到TestProbe.ref

在我的specs2中,我希望能夠在爲演員A提供相應的TestKit.TestProbe.ref的同時檢索嘲諷B的探針。

我願做這樣的事情:

implicit val inj = (new TestModule(){ 
    bind[TestProbe] identifiedBy 'probeForB to TestProbe() 
    bind[B] to inject[TestProbe]('probeForB).ref 
}).injector 

inject[TestProbe]('probeForB).expectMsgType[] must ... 

的問題是,裁判是ActorRef,因此不符合預期的B類型。

有沒有一種乾淨的方法來做到這一點? 我們可以指定一個ActorRef返回injectActorRef[B]


我最終重寫了演員A的綁定。

val probeForB = TestProbe() 

implicit val inj = (new Module() { 
    bind[A] to new A() { 
     override def injectB(): ActorRef = probeForB.ref 
    } 
}).injector 

回答

1

至於你提到的問題是,inject[TestProbe]('probeForB).ref給你一個ActorRef回,而不是實際的演員的一個實例。

如果您想以您描述的方式對其進行測試,則還需要爲演員B定義一個ActorRef的綁定。例如:

bind [BActor] toProvider new BActor 
bind [ActorRef] identifiedBy 'bRef to { 
    implicit val system = inject [ActorSystem] 
    injectActorRef[BActor] 
} 

當你有這樣的設置,那麼您可以覆蓋與測試探頭第二個結合:

bind [ActorRef] identifiedBy 'bRef to inject[TestProbe]('probeForB).ref 

請注意,這個例子是不是直接等同,因爲BActor現在有一個不同主管(監護人演員,這就是爲什麼我們需要在這裏注入ActorSystem)。

injectActorRef將演員創作委託給context.actorOf的「背景」(父演員或演員系統)。有用的是,它創建了一個特殊的Props,當akka想要創建一個類時,它會注入新類的BActor類。這意味着scaldi不能控制actor的生命週期(這很重要,因爲akka本身具有非常複雜的機制),它只是給了我們關於如何創建特定actor類的新實例的知識。

如果要創建另一名演員中的演員(像你描述的),然後他們倆的生命週期緊密關聯,並通過阿卡管理。這就是爲什麼在這種情況下,您不能簡單地覆蓋和Actor綁定與測試的ActorRef綁定。

+0

在我的情況下,失去親子關係不是一種選擇。我會試着看一下'class TestActorRef'。 –

相關問題