【问题标题】:Akka.net Testkit does not mark test case failed despite ActorInitializationException exception尽管 ActorInitializationException 异常,Akka.net Testkit 不会将测试用例标记为失败
【发布时间】:2016-08-25 08:57:06
【问题描述】:

以下是我定义的演员(试图让我的头脑围绕持久演员!)

public class Country : ReceivePersistentActor
{
    public override string PersistenceId => GetType().Name + state.Id;

    private CountryState state;

    public Country()
    {
        Command<CreateCountry>(CreateCountry);
    }

    private bool CreateCountry(CreateCountry cmd)
    {
        Persist(new CountryCeated
        {
            Id = cmd.Id,
            Code = cmd.Code,
            Description = cmd.Description,
            Active = cmd.Active
        }, evt =>
        {
            state = new CountryState
            {
                Id = evt.Id,
                Code = evt.Code,
                Description = evt.Description,
                Active = evt.Active
            };
        });

        return true;
    }
}

以下是我定义的单元测试用例:

[TestClass]
public class CountrySpec : TestKit
{
    [TestMethod]
    public void CountryActor_Should_Create_A_Country()
    {
        var country = Sys.ActorOf(Props.Create(() => new Country()), "Country");
        country.Tell(new CreateCountry(Guid.NewGuid(), "UK", "United Kingdom", true));
        ExpectNoMsg();
    }
}

当我运行测试用例时,我可以在测试用例的输出窗口中看到一个异常

[ERROR][25/08/2016 08:25:07][Thread 0007][akka://test/user/Country] Object reference not set to an instance of an object.
Cause: [akka://test/user/Country#552449332]: Akka.Actor.ActorInitializationException: Exception during creation ---> System.NullReferenceException: Object reference not set to an instance of an object.
   at Domain.Country.get_PersistenceId() in Y:\Spikes\StatefulActors\Domain\Country.cs:line 9
   at Akka.Persistence.Eventsourced.StartRecovery(Recovery recovery)
   at Akka.Persistence.Eventsourced.AroundPreStart()
   at Akka.Actor.ActorCell.<>c__DisplayClass154_0.<Create>b__0()
   at Akka.Actor.ActorCell.UseThreadContext(Action action)
   at Akka.Actor.ActorCell.Create(Exception failure)
   --- End of inner exception stack trace ---
   at Akka.Actor.ActorCell.Create(Exception failure)
   at Akka.Actor.ActorCell.SysMsgInvokeAll(EarliestFirstSystemMessageList messages, Int32 currentState)

但测试用例被标记为成功

TestKit 中是否有任何方法/设置,可以在其中设置任何异常,将测试用例标记为失败?

【问题讨论】:

    标签: unit-testing akka.net akka-testkit


    【解决方案1】:

    默认情况下,actor 内部的任何异常都被封装 - 这意味着它们不会冒泡,从而破坏系统的其余部分。

    Actor 进入系统,可以通过观察它们相互通信的方式来进行测试。通常它涉及从参与者系统提供输入和断言输出 - 在您的情况下测试已经通过,因为您没有验证任何输出。从您的测试的角度来看,这个演员可能已经死了,但不会有什么不同。

    验证输出(通过参与者内部的断言或即使用自定义测试日志)是处理测试的最佳方式。

    如果由于某种原因您仍然需要在 Actor 内部捕获异常,您可以创建绑定到 TestActor 的监督策略,所有异常都可以在其中转发:

    public class TestingStrategy : OneForOneStrategy
    {
        protected TestingStrategy(IActorRef probe) : base(exception =>
        {
            probe.Tell(exception);
            return DefaultDecider.Decide(exception);
        }) { }
    }
    

    【讨论】:

    • 感谢您的回答,现在可以理解为什么测试没有失败。你能帮忙/分享一个关于如何设置自定义测试日志的链接吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 2017-10-28
    • 2018-11-28
    • 2015-12-27
    • 1970-01-01
    相关资源
    最近更新 更多