我正在尝试测试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,因此将无法收听预期的消息。所以我的问题是如何正确安排测试的部分?
答案 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的交互,您的测试就不会那么脆弱了