如何使用来自testprobe

时间:2018-10-12 12:40:15

标签: akka.net akka-testkit

我正在尝试测试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,因此将无法收听预期的消息。所以我的问题是如何正确安排测试的部分?

2 个答案:

答案 0 :(得分:0)

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

  

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

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

答案 1 :(得分:0)

您所创造的情况是相当人为的。因为在现实世界中,您要么将MessageB发送给另一个参与者。然后您就可以用TestProbe替代它。否则,您将验证messageB的副作用。因此,例如,将messageB发送给Self会更新演员的一些属性,然后可以对其进行测试。

还可以看到Chima的回应,他展示了创建演员的正确方法。因为仅实例化Props是不够的。

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