У меня странное поведение при использовании context.become в PersistentActor (не уверен, что постоянство имеет какое-либо отношение к причине проблемы). Мой код выглядит примерно так:
class MyActor extends PersistentActor {
import context._
// Messages
case object Start
case object Ready
case object MessageX
// Events
case object Started
def recieveRecover: Receive = { /* Not relevant, I think */}
def receiveCommand: Receive = idle
def idle: Receive = {
case Start =>
persist(Started) { _ =>
sender() ! Ready
become(ready)
}
}
def ready: Receive = {
case MessageX => doSomething()
}
}
И у меня есть два теста в одном файле MyActorSpec. Первый просто проверяет состояние «ожидания», а второй проверяет состояние «готово»:
"Test A" in {
val actorRef = system.actorOf( MyActor.props(), "test-A-actor" )
actorRef ! Start
expectMsg(Ready)
}
"Test B" in {
val actorRef = system.actorOf( MyActor.props(), "test-B-actor" )
actorRef ! Start
expectMsg(Ready) /* It fails here because for some reason the actorRef
was created with its 'receiveCommand' block equal to
the 'ready' block and not equal to the 'idle' block as its suppossed to.
So it timeouts here waiting for the message which is not handled in
the 'ready' block */
actorRef ! MessageX
testSomethingAboutTheMessageX()
}
Если я запускаю оба теста, первый завершается успешно, а второй завершается ошибкой в ожидании сообщения о готовности (как объяснено в комментарии ко второму тесту). Если я запускаю только второй тест, он проходит. Итак, я не уверен, что сделал что-то не так, когда определял актера.
ОБНОВЛЕНИЕ: я попытался удалить постоянство для события Started
(часть persist(Started)
), как было предложено, и тесты сработали, как и ожидалось (оба актера были созданы в состоянии idle
). Итак, что происходит, так это то, что события в первом экземпляре актора сохраняются, а затем второй экземпляр актора воспроизводит их, и это потому, что экземпляры актора создаются с одним и тем же persistenceId
(DOH!). Итак, способ сделать тесты независимыми состоял в том, чтобы просто создать экземпляр каждого актора с разными persistenceId
.
system
в каждом тесте, чтобы убедиться, что нет общего состояния? - person millhouse   schedule 03.11.2014