C# 如何测试akka.net持久参与者

C# 如何测试akka.net持久参与者,c#,akka.net,akka.net-persistence,C#,Akka.net,Akka.net Persistence,我正在使用[Akka.Net 1.3.1]混合使用ReceiveActors和ReceivePersistentActors,现在我想为我的Actor系统编写测试 MyPersistentActor继承自ReceivePersistentActor,MyActor继承自ReceiveActor 我还使用1.3.1版安装了Akka.TestKit 但似乎只有ReceiveActors可以通过Akka.TestKit进行测试。 IActorRef myActorRef=this.Sys.Actor

我正在使用[Akka.Net 1.3.1]混合使用ReceiveActors和ReceivePersistentActors,现在我想为我的Actor系统编写测试

MyPersistentActor继承自ReceivePersistentActor,MyActor继承自ReceiveActor

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

但似乎只有ReceiveActors可以通过Akka.TestKit进行测试。

IActorRef myActorRef=this.Sys.ActorOf();//很好
IActorRef myPersistentActorRef=this.Sys.ActorOf();//这是个问题

我还发现了nuget包Akka.Persistence.TestKit版本1.2.3.43-beta。测试版自三个月以来一直没有更改,只支持akka 1.2.2。它还在开发中还是已经死了。我找不到有关这方面的任何资料

如何测试您的持久参与者

谢谢你的帮助

Richi

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

除了让日志/快照存储的实现在内存中工作之外,没有内置的方法可以与日志/快照存储协作进行测试。话虽如此,您实际上可以像处理任何其他参与者一样处理日志/快照存储。如果您研究持久性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>();
}
void InitWithEvents(字符串persistenceId,参数对象[]事件)
{
var probe=CreateTestProbe();
var writerGuid=Guid.NewGuid().ToString();
var writes=new AtomicWrite[events.Length];
for(int i=0;i

PS:持久性测试工具包API中显然缺少了一个部分,对此领域的任何贡献都是非常受欢迎的。

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

如果有人遇到与我相同的问题,这就是我如何根据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;
        }
private void InitWithEvents(字符串persistenceId,IList事件)
{
var probe=CreateTestProbe();
var writerGuid=Guid.NewGuid().ToString();
var writes=new AtomicWrite[events.Count];
for(int i=0;i
因此,如果我正确地理解了这一点,那么就没有办法在Command()方法中测试persistence-actor逻辑了?我现在处于同样的情况,差不多两年后。在这方面是否有任何发展,使我们能够有效地测试顽固的行动者?