【问题标题】:How to create actor with parameterized constructor from testprobe如何使用来自 testprobe 的参数化构造函数创建参与者
【发布时间】:2018-10-15 21:58:00
【问题描述】:

我正在尝试对 MyActor 进行测试,以便在有条件的情况下向其自身发送 MessageB。 MyActor 将设置作为构造函数参数。设置没有设置器,因为它在创建后是不可变的。

public class MyActor : ReceiveActor
{
    private bool Setting { get; }

    public MyActor(bool setting)
    {
        Setting = setting;

        Receive<MessageA>(message => HandleMessageA(message));
    }

    public void HandleMessageA(MessageA message)
    {
        if (Setting)
            Self.Tell(new MessageB);
    }
}

这是测试

[Test]
public void HandleMessageA_SettingIsTrue_MessageBIsSent()
{
    bool setting = true;
    var testProbe = this.CreateTestProbe();
    var myActor = Props.Create<MyActor>(testProbbe);

    myActor.Tell(new MessageA);

    myActor.ExpectMsg<MessageB>();
}

我的问题是我不知道如何将 bool 设置传递给构造函数。 好吧,我可以这样写

bool setting = true;
var myActor = Props.Create<MyActor>(setting);

这样 myActor 将设置设置。但是我没有使用 TestProbe,因此将无法收听预期的消息。所以我的问题是如何正确安排测试部分?

【问题讨论】:

    标签: akka.net akka-testkit


    【解决方案1】:

    使用 Akka.NET 进行测试的精彩 guide 描述了如何在测试系统中创建参与者:

    在 Sys 中创建您的演员,以便您的演员存在于同一个 ActorSystem 作为 TestActor。

    // create an actor in the TestActorSystem
    var actor = Sys.ActorOf(Props.Create(() => new MyActorClass()));
    

    【讨论】:

      【解决方案2】:

      嗯,你创造的情况是相当人为的。因为在现实世界的场景中,您要么将 MessageB 发送给另一个参与者。然后您可以用 TestProbe 替换它。或者您将验证您的 messageB 会产生的副作用。因此,例如将 messageB 发送给 Self,将更新您的 actor 的某些属性,然后您可以对其进行测试。

      另请参阅 Chima 的回应,他展示了创建演员的正确方法。因为只实例化 Props 是不够的。

      还有一些一般性的建议。在测试参与者时,您将要尽量避免测试单个消息。尝试测试发送这些消息的结果(或副作用)。这样一来,如果您重构 Actor 的交互,您的测试就不会那么脆弱了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-28
        • 1970-01-01
        相关资源
        最近更新 更多