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 发送消息,消息传递是异步发生的,因此必须等到所有操作完成已完成。
我有以下 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 发送消息,消息传递是异步发生的,因此必须等到所有操作完成已完成。