c# - Akka.net 和单元测试

标签 c# unit-testing akka.net

我想使用 Akka.net TestKit 来编写单元测试,但我有一个问题。我有一个 SubscriptionService 类,它负责将消息传输给选定的参与者。

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<RequestMessage>(message => this.ProcessRequestMessage(message));
    }

    private void ProcessRequestMessage(RequestMessage message)
    {
        this.service1.Tell(message);
        this.service2.Tell(message);
    }

我如何测试这种行为?我创建了这个测试,但在这个测试中我得到了异常。 “其他信息:Assert.Fail 失败。失败:WAITING消息时超时 00:00:03

[TestClass]
public class SubscriptionServiceUnitTests : TestKit
{
    [TestMethod]
    public void Test1()
    {
        var subscriptionServiceRef = this.ActorOfAsTestActorRef<SubscriptionService>("SubscriptionService");

        subscriptionServiceRef.Tell(new RequestMessage());

        var answer = this.ExpectMsg<RequestMessage>();
    }

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

最佳答案

ExpectMsg 仅在与称为 TestActor 的特殊类型的 actor 结合使用时才有效。您可以从测试套件访问/创建它。它的作用是捕获并验证发送给它的消息。

如果您稍微重新设计您的 SubscriptionService actor,您可以将测试 actor 引用传递给它。最简单的方法是通过 actor 构造函数简单地注入(inject) actor refs - 我使用了 ICanTell 接口(interface),这是更通用的形式,由 actor refs 和 actor selection 实现:

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<RequestMessage>(message => this.ProcessRequestMessage(message));
    }

这样您可以使用以下方式创建您的 Actor :

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

要测试它,请在您的 TestKit 规范类中使用 TestActor 或 TestProbe 对其进行初始化。

关于c# - Akka.net 和单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31103148/

相关文章:

c# - 如何获取用 C# 挂载的 ISO 的驱动器号

javascript - 在对 AngularJS Controller 进行单元测试时如何模拟网络延迟?

akka - 带有 Akka.NET : how to prevent sending messages to dead actors 的 Actor 模型

c# - Akka.Net ConsistencyHashing 路由器作为内存数据对象的负载均衡器

c# - 不同大小对象的内存池 - C#

c# - 在 db.database.BeginTransaction() 范围下添加时,Entity FrameWork Core 不响应 where() 查询 -Exception(请求超时)

c# - 如何查看系统音频是否静音?

c# - 在不创建单独项目的情况下使用 Nunit

django - 如何为新的第三方 Django 库编写单元测试

c# - Akka.net vs Orleans 表现