1

APlay 2.4 アプリケーション内で Scaldi を使用してアクターをテストしようとしています。このアクターはinjectActorRef[B]、私がTestKit.TestProbe.

B私のspecs2内では、対応するTestKit.TestProbe.refをactorに提供しながら、mockedのプローブを取得できるようにしたいと考えていますA

私はこのようなことをしたいと思います:

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

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

問題は、ref が であるため、予期されるタイプActorRefと一致しないことです。B

それを行うためのきれいな方法はありますか?によって返される ActorRef を指定できますinjectActorRef[B]か?


Actor のバインドをオーバーライドすることになりましたA

val probeForB = TestProbe()

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

1 に答える 1

1

あなたが言及したように、問題は実際のアクターのインスタンスではなくinject[TestProbe]('probeForB).ref、バックを返すことです。ActorRef

説明した方法でテストしたい場合はActorRef、アクターのバインディングも定義する必要がありますB。例えば:

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

このセットアップが完了したら、テスト プローブで 2 番目のバインディングをオーバーライドできます。

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

BActorこの例は、別のスーパーバイザー (ガーディアン アクター、ここに を注入する必要がある理由) を持っているため、直接同等ではないことに注意してくださいActorSystem

injectActorRefを使用して、アクターの作成を「コンテキスト」(親アクターまたはアクター システム) に委任しcontext.actorOfます。それが役立つのは、akka がクラスを作成したいときPropsにクラスの新しいインスタンスを挿入する特別なインスタンスを作成することです。BActorこれは、scaldi がアクターのライフサイクルを制御できないことを意味します (akka 自体には非常に洗練されたメカニズムがあるため、これは非常に重要です)、特定のアクター クラスの新しいインスタンスを作成する方法を akka に与えるだけです。

別のアクター内でアクターを作成している場合 (説明したように)、それらのライフサイクルは akka によって強く接続され、管理されます。これが、この場合、単純にオーバーライドしてテストActorのバインディングでバインドすることができない理由です。ActorRef

于 2015-10-21T16:45:30.350 に答える