我正在使用[Akka.Net 1.3.1]混合了ReceiveActors和ReceivePersistentActors,现在我想为我的actor系统编写测试。
MyPersistentActor继承自ReceivePersistentActor,MyActor继承自ReceiveActor。
我还使用版本1.3.1安装了Akka.TestKit。
但似乎只有ReceiveActors可以通过Akka.TestKit进行测试。
Á
我还发现了nuget包Akka.Persistence.TestKit版本1.2.3.43-beta。测试版自三个月以来没有改变,仅支持akka 1.2.2。它还处于开发阶段还是已经死了。我找不到任何关于此的信息。
你如何测试你的持久演员?
感谢您的帮助!
RICHI
答案 0 :(得分:2)
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中显然缺少一部分,对该领域的任何贡献都非常受欢迎。
答案 1 :(得分:0)
我知道这是一个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;
}