0

私のTestKitテストでは

"A History Actor" must {

    // given
    val historyActorRef = TestActorRef(new HistoryActor("history-file.log"))       // Creation of the TestActorRef
    val writerActorRef = TestActorRef(new WriterActor("history-file.log"))       // Creation of the TestActorRef

    historyActorRef.underlyingActor.writerActor = writerActorRef

    "receive messages and change state" in {  // integration-like test

      // This call is synchronous. The actor receive() method will be called in the current thread

      // when
      historyActorRef ! WriteMsg("line 1")

      // then (1) - got WriteResult (from WriterActor as result of getting WriteMsg)
      within(200 millis) {
        expectMsg(WriteResult(1, 7))
      }

      // then (2) - state
      historyActorRef.underlyingActor.lastWrite must equal(WriteResult(1,7)) // With actorRef.underlyingActor, we can access the react actor instance created by Akka
    }
  }

このテストは失敗します。WriteResult(0,0)

私の作品での方法HistoryActor

   case cmd: WriteMsg => {

      log.info("forwarding " + cmd + " to the writer" )

      writerActor ! cmd

    }

    case result: WriteResult => {

      log.info("WriteResult: " + result)

      lastWrite = result                  // update the state

    } 

WriteResultでは、結果をチェックするときに、それがすでに処理されていることを確認するテストを作成するにはどうすればよいでしょうか?

PS 個別にテストすることを検討すべきWriterActorだったと思いますが、統合のようなテストが必要だとしましょう。

4

1 に答える 1

1

TestActorRefまだ行っていない場合は、ここでテスト対象の両方のアクターを s でラップする必要があります。これにより、両方が呼び出し元のスレッド ディスパッチャーを使用して、テスト シナリオから非同期性を取り除くことができます。writeActorまた、テスト用に yourを aに置き換えてTestProbeから、その動作をモックすることも検討できます。

アップデート

私のコメントによると:

あなたが言っているexpectMsgことは、テスト自体 (によって持ち込まれた暗黙の送信者TestKit) が、テストを開始するために最初に送信したメッセージから応答メッセージを受信して​​いるということです。それはあなたが主張しようとしているものではないと思うので、削除することをお勧めします。書き込みアクターがそのメッセージを受け取ったとあなたは言おうとしていると思いますが、それはテスト キットのアサーションがどのように機能するかではありません。内部状態が更新されていることを確認するだけで十分です。

于 2015-07-08T16:41:48.810 に答える