【问题标题】:Testing behavior not consistent when watching actor for termination观察演员终止时的测试行为不一致
【发布时间】:2016-11-23 15:07:28
【问题描述】:

当我编写涉及订阅 Eventstream 上的事件或观看演员并列出“已终止”的测试时,测试可以正常运行它们 1 接 1,但是当我运行整个测试套件时,这些测试会失败。 如果这些测试中的每一个都在 Xunit 的单独测试类中,这些测试也可以工作。

怎么会?

带有此类测试的仓库:https://github.com/Lejdholt/AkkaTestError

【问题讨论】:

  • 我用 NUnit 测试了这个,如果我一起运行所有测试 GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess 每次都会失败。如果我单独运行一项测试,它总是有效的。但是所有测试一起运行良好,如果我重新排序它们,将GivenProcessExist_WhenProcessterminates_ShouldLogRemovingProcess 作为第一个执行。

标签: tdd akka.net akka-testkit


【解决方案1】:

查看了您的存储库。我可以重现您描述的问题。

感觉就像是 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 实现。

【讨论】:

    猜你喜欢
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    • 1970-01-01
    • 2021-02-11
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    相关资源
    最近更新 更多