0

我有以下 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.");
}
4

1 回答 1

0

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

于 2015-05-15T12:06:03.980 回答