0

我正在尝试对 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 setting = true;
var myActor = Props.Create<MyActor>(setting);

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

4

2 回答 2

1

使用 Akka.NET 进行测试的一个很好的指南描述了如何在测试系统中创建参与者:

在 Sys 中创建您的演员,以便您的演员与 TestActor 存在于相同的 ActorSystem 中。

// create an actor in the TestActorSystem
var actor = Sys.ActorOf(Props.Create(() => new MyActorClass()));
于 2018-10-12T15:57:32.637 回答
0

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

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

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

于 2018-10-15T13:58:00.217 回答