观察演员终止时测试行为不一致
Testing behavior not consistent when watching actor for termination
当我编写涉及订阅 Eventstream 上的事件或观看演员并监听 "Terminated" 的测试时,测试工作正常 运行1 对 1,但是当我 运行 那些测试失败的整个测试套件。
如果这些测试中的每一个都在单独的测试中,那么测试也有效 class 与 Xunit。
怎么会?
包含此类测试的回购协议:https://github.com/Lejdholt/AkkaTestError
查看了您的存储库。我可以重现你描述的问题。
感觉像是 TestKit 中的错误,某处的时间问题。但很难确定。
此外,并非所有单元测试框架都是平等创建的。 testkit 使用自己的 TaskDispatcher 来测试通常本质上是异步处理的操作。
这有时会导致与正在使用的测试框架发生一些冲突。也巧合的是为什么 akka.net 也为了自己的 CI 进程而迁移到 XUnit。
我已经通过不使用 TestProbe 解决了您的问题。虽然我不确定问题是否出在 TestProbe 上,或者你在哪里使用全局引用(你的 'process' 变量)。
我怀疑测试框架虽然 运行 并行测试,但可能会导致您的测试探针引用发生一些奇怪的事情。
我如何更改您的一项测试的示例:
[Test]
public void GivenAnyTime_WhenProcessTerminates_ShouldLogStartRemovingProcess()
{
IProcessFactory factory = Substitute.For<IProcessFactory>();
var testactor = Sys.ActorOf<FakeActor>("test2");
processId = Guid.NewGuid();
factory.Create(Arg.Any<IActorRefFactory>(), Arg.Any<SupervisorStrategy>()).Returns(testactor);
manager = Sys.ActorOf(Props.Create(() => new Manager(factory)));
manager.Tell(new StartProcessCommand(processId));
EventFilter.Info("Removing process.")
.ExpectOne(() => Sys.Stop(testactor));
}
关于您应该如何更改您的其他测试应该是相当不言自明的。
FakeActor
只不过是一个空的 ReceiveActor
实现。
当我编写涉及订阅 Eventstream 上的事件或观看演员并监听 "Terminated" 的测试时,测试工作正常 运行1 对 1,但是当我 运行 那些测试失败的整个测试套件。 如果这些测试中的每一个都在单独的测试中,那么测试也有效 class 与 Xunit。
怎么会?
包含此类测试的回购协议:https://github.com/Lejdholt/AkkaTestError
查看了您的存储库。我可以重现你描述的问题。
感觉像是 TestKit 中的错误,某处的时间问题。但很难确定。 此外,并非所有单元测试框架都是平等创建的。 testkit 使用自己的 TaskDispatcher 来测试通常本质上是异步处理的操作。 这有时会导致与正在使用的测试框架发生一些冲突。也巧合的是为什么 akka.net 也为了自己的 CI 进程而迁移到 XUnit。
我已经通过不使用 TestProbe 解决了您的问题。虽然我不确定问题是否出在 TestProbe 上,或者你在哪里使用全局引用(你的 'process' 变量)。 我怀疑测试框架虽然 运行 并行测试,但可能会导致您的测试探针引用发生一些奇怪的事情。
我如何更改您的一项测试的示例:
[Test]
public void GivenAnyTime_WhenProcessTerminates_ShouldLogStartRemovingProcess()
{
IProcessFactory factory = Substitute.For<IProcessFactory>();
var testactor = Sys.ActorOf<FakeActor>("test2");
processId = Guid.NewGuid();
factory.Create(Arg.Any<IActorRefFactory>(), Arg.Any<SupervisorStrategy>()).Returns(testactor);
manager = Sys.ActorOf(Props.Create(() => new Manager(factory)));
manager.Tell(new StartProcessCommand(processId));
EventFilter.Info("Removing process.")
.ExpectOne(() => Sys.Stop(testactor));
}
关于您应该如何更改您的其他测试应该是相当不言自明的。
FakeActor
只不过是一个空的 ReceiveActor
实现。