观察演员终止时测试行为不一致

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 实现。