Akka.NET TestKit 同步行为

Akka.NET TestKit synchronous behavior

我有以下 C# 代码来测试 AKKA.NET 演员的行为。语句 productActor.Tell(new ChangeActiveStatus(true)); 应该是一个阻塞调用(TestKit 按照这个 blog 使它成为一个同步调用)但我立即看到它 returns 。结果,第二个测试失败了,尽管稍后会更改 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.");
}

我见过的大多数 AKKA.NET 单元测试只使用两个参与者。显示示例的博客(在原始问题中)只有两个演员,所以它会起作用,因为操作是同步的。如果系统中有多个 actor,例如 Actor A 向 Actor B 发送消息,向 Actor C 发送消息,再向 Actor A 发送消息,消息传递是异步发生的,因此必须等到所有操作完成已完成。