【问题标题】:How to test akka.net persistent actors如何测试 akka.net 持久演员
【发布时间】:2020-05-06 22:37:59
【问题描述】:

我正在使用 [Akka.Net 1.3.1] ReceiveActors 和 ReceivePersistentActors 的组合,现在我想为我的 actorsystem 编写测试。

MyPersistentActor 继承自 ReceivePersistentActor,MyActor 继承自 ReceiveActor。

我还使用 1.3.1 版本安装了 Akka.TestKit。

但似乎只有 ReceiveActors 可以被 Akka.TestKit 测试。 IActorRef myActorRef = this.Sys.ActorOf<MyActor>(); // is fine IActorRef myPersistentActorRef = this.Sys.ActorOf<MyPersistentActor>(); // is a problem

我还找到了 nuget 包 Akka.Persistence.TestKit 版本 1.2.3.43-beta 。测试版自三个月以来没有更改,仅支持 akka 1.2.2 。它还在开发中还是已经死了。我找不到任何相关的信息。

你如何测试你的持久演员?

感谢您的帮助!

里奇

【问题讨论】:

  • 我现在处于同样的情况,差不多两年后。该领域是否有任何进展可以让我们有效地测试持久性参与者?

标签: c# akka.net akka.net-persistence


【解决方案1】:

Akka.Persistence.TestKit 已重命名为 Akka.Persistence.TCK,它仅用于测试自定义事件日志和快照存储实现与 Akka 的兼容性。持久性协议。它没有带来任何用于测试用户参与者的实用程序。

除了在内存中实现它们之外,没有内置方法可以与日志/快照存储合作以进行测试。话虽如此,您实际上可以像使用任何其他演员一样使用日记/快照存储。如果您研究像 JournalSpec 这样的持久性 TCK 规范的实现,您可能会对该协议的工作原理有所了解。

例如,如果你想在触发测试用例之前用一些事件初始化你的日志,你可以这样做:

void InitWithEvents(string persistenceId, params object[] events)
{
    var probe = CreateTestProbe();
    var writerGuid = Guid.NewGuid().ToString();
    var writes = new AtomicWrite[events.Length];
    for (int i = 0; i < events.Length; i++)
    {
        var e = events[i];
        writes[i] = new AtomicWrite(new Persistent(e, i+1, persistenceId, "", false, ActorRefs.NoSender, writerGuid));
    }
    var journal = Persistence.Instance.Apply(Sys).JournalFor(null);
    journal.Tell(new WriteMessages(writes, probe.Ref, 1));

    probe.ExpectMsg<WriteMessagesSuccessful>();
    for (int i = 0; i < events.Length; i++)
        probe.ExpectMsg<WriteMessageSuccess>();
}

PS:持久性 TestKit API 显然缺少一部分,欢迎对该领域的任何贡献。

【讨论】:

  • 所以如果我得到正确的结果,就没有办法在 Command() 方法中测试持久性参与者逻辑?
【解决方案2】:

我知道这是一个 ols 答案,但我找不到更好的资源。在我的测试中,我实际上只对在我发出命令后正确的事件持续存在感兴趣。通过开始一个 saga 可以引发多个事件。大多数时候我只对最后一个持久事件感兴趣。

如果有人遇到与我相同的问题,这就是我根据 Bartosz initWithEvents 修复获取最后一条消息的方法。

        private void InitWithEvents(string persistenceId, IList<object> events)
        {
            var probe = CreateTestProbe();
            var writerGuid = Guid.NewGuid().ToString();

            var writes = new AtomicWrite[events.Count];
            for (int i = 0; i < events.Count; i++)
            {
                var e = events[i];
                writes[i] = new AtomicWrite(new Persistent(e, i+1, persistenceId, "", false, ActorRefs.NoSender, writerGuid));
            }
            journal = Persistence.Instance.Apply(Sys).JournalFor(null);
            journal.Tell(new WriteMessages(writes, probe.Ref, 1));

            probe.ExpectMsg<WriteMessagesSuccessful>();
            for (int i = 0; i < events.Count; i++)
                probe.ExpectMsg<WriteMessageSuccess>();
        }

        private object GetLastPersistedMessageFromJournal(string persistenceId)
        {
            var repointable = journal as RepointableActorRef;
            var underlying = repointable.Underlying as ActorCell;

            PropertyInfo prop = typeof(ActorCell).GetProperty("Actor", BindingFlags.NonPublic | BindingFlags.Instance);
            MethodInfo getter = prop.GetGetMethod(nonPublic: true);
            MemoryJournal jrnl = getter.Invoke(underlying, null) as MemoryJournal;

            var read = jrnl?.Read(persistenceId, 0, Int64.MaxValue, Int64.MaxValue);
            return read?.Last().Payload;
        }

【讨论】:

    猜你喜欢
    • 2014-09-30
    • 1970-01-01
    • 2015-05-10
    • 2019-11-11
    • 1970-01-01
    • 2015-02-22
    • 2016-02-03
    • 1970-01-01
    • 2021-02-11
    相关资源
    最近更新 更多