[英]How to test akka.net persistent actors
我正在使用 [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 version 1.2.3.43-beta 。 测试版自三个月以来未更改,仅支持 akka 1.2.2 。 它仍在开发中还是已经死了。 我找不到任何关于此的信息。
你如何测试你坚持不懈的演员?
感谢您的帮助!
里奇
Akka.Persistence.TestKit已重命名为Akka.Persistence.TCK ,它仅用于测试自定义事件日志和快照存储实现以与 Akka.Persistence 协议兼容。 它没有带来任何用于测试用户角色的实用程序。
除了在内存中运行它们的实现之外,没有内置的方法可以与日志/快照存储合作以进行测试。 话虽如此,您实际上可以像使用任何其他演员一样使用日记/快照存储。 如果您研究诸如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 中显然缺少一个部分,非常欢迎对该领域的任何贡献。
我知道这是一个 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;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.