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, то обмен сообщениями происходит асинхронно, поэтому необходимо дождаться завершения всех операций.

Другие вопросы по тегам