当我编写涉及订阅 Eventstream 上的事件或观看演员并列出“终止”的测试时,测试可以正常运行它们 1 接 1 但是当我运行整个测试套件时,这些测试会失败。如果这些测试中的每一个都在 Xunit 的单独测试类中,测试也可以工作。
怎么来的?
当我编写涉及订阅 Eventstream 上的事件或观看演员并列出“终止”的测试时,测试可以正常运行它们 1 接 1 但是当我运行整个测试套件时,这些测试会失败。如果这些测试中的每一个都在 Xunit 的单独测试类中,测试也可以工作。
怎么来的?
查看了您的存储库。我可以重现您描述的问题。
感觉就像 TestKit 中的一个错误,某个地方的一些时间问题。但很难确定。此外,并非所有单元测试框架都是平等创建的。testkit 使用自己的 TaskDispatcher 来测试通常固有的异步处理操作。这有时会导致与正在使用的测试框架发生一些冲突。也巧合的是,akka.net 也为自己的 CI 流程迁移到了 XUnit。
通过不使用 TestProbe,我设法解决了您的问题。虽然我不确定问题是否出在 TestProbe 上,或者您在哪里使用全局引用(您的“进程”变量)。我怀疑测试框架在并行运行测试时可能会导致您的测试探针引用发生一些奇怪的事情。
我如何更改您的一项测试的示例:
[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
。