Akka.net和unit testing

我想使用Akka.net TestKit编写unit testing,但我有一个问题。 我有一个类SubscriptionService,负责向选定的actor传输消息。

public class SubscriptionService : ReceiveActor { private readonly ActorSelection service1; private readonly ActorSelection service2; public SubscriptionService() { this.service1 = Context.ActorSelection("Service1"); this.service2 = Context.ActorSelection("Service2"); this.Receive(message => this.ProcessRequestMessage(message)); } private void ProcessRequestMessage(RequestMessage message) { this.service1.Tell(message); this.service2.Tell(message); } 

我该如何测试这种行为? 我创建了这个测试但是在这个测试中我得到了exception。 “ 附加信息:Assert.Fail失败。失败:等待消息时超时00:00:03

 [TestClass] public class SubscriptionServiceUnitTests : TestKit { [TestMethod] public void Test1() { var subscriptionServiceRef = this.ActorOfAsTestActorRef("SubscriptionService"); subscriptionServiceRef.Tell(new RequestMessage()); var answer = this.ExpectMsg(); } 

我的意思是如何在Test1方法中获取service1和service2的消息?

ExpectMsg仅在与特殊类型的名为TestActor的actor结合使用TestActor 。 您可以从测试工具包访问/创建它。 它的作用是捕获并validation发送给它的消息。

如果您稍微重新设计SubscriptionService actor,则可以将测试actor refs传递给它。 最简单的方法是简单地通过actor构造函数注入actor refs – 我使用了ICanTell接口,这是更通用的forms,由actor refs和actor选择实现:

 public class SubscriptionService : ReceiveActor { private readonly ICanTell service1; private readonly ICanTell service2; public SubscriptionService(ICanTell service1, ICanTell service2) { this.service1 = service1; this.service2 = service2; this.Receive(message => this.ProcessRequestMessage(message)); } 

这样你就可以使用以下方法创建你的演员

 Context.ActorOf(Props.Create(() => new SubscriptionService(Context.ActorSelection("Service1"), Context.ActorSelection("Service2"))); 

要测试它,在TestKit规范类中使用TestActor或TestProbe初始化它。