Akka.NET TestKit синхронное поведение
У меня есть следующий код C# для проверки поведения актера AKKA.NET. Заявление productActor.Tell(new ChangeActiveStatus(true));
ожидается, что это будет блокирующий вызов (TestKit делает его синхронным вызовом согласно этому блогу), но я вижу, что он немедленно возвращается. В результате второй тест не пройден, хотя ActiveStatus будет изменен позже.
[TestMethod]
public void ProductActorUnitTests_CheckFor_ActiveStatusChanged()
{
var productActor = ActorOfAsTestActorRef<ProductActor>();
Assert.IsTrue(ProductActor.UnderlyingActor.ActiveStatus == false, "The initial ActiveStatus is expected to be FALSE.");
productActor.Tell(new ChangeActiveStatus(true));
Assert.IsTrue(productActor.UnderlyingActor.ActiveStatus == true, "The new ActiveStatus is expected to be TRUE.");
}
****** ОБНОВИТЬ *****
Следующий код с Thread.Sleep(10000) успешно выполняется:
[TestMethod]
public void ProductActorUnitTests_CheckFor_ActiveStatusChanged()
{
var productActor = ActorOfAsTestActorRef<ProductActor>();
Assert.IsTrue(ProductActor.UnderlyingActor.ActiveStatus == false, "The initial ActiveStatus is expected to be FALSE.");
productActor.Tell(new ChangeActiveStatus(true));
Thread.Sleep(10000);
Assert.IsTrue(productActor.UnderlyingActor.ActiveStatus == true, "The new ActiveStatus is expected to be TRUE.");
}
1 ответ
В большинстве модульных тестов AKKA.NET, которые я видел, используются только два актера. Блог, в котором показан пример (в исходном вопросе), имеет только двух участников, поэтому он будет работать, потому что операции являются синхронными. Если в системе имеется несколько действующих лиц, например, актер A отправляет сообщения актору B, который отправляет сообщения актеру C, а затем снова отправляет сообщения актеру A, то обмен сообщениями происходит асинхронно, поэтому необходимо дождаться завершения всех операций.