如何创建两个不同的测试演员

时间:2016-12-07 14:15:14

标签: unit-testing akka.net

我有多个孩子的父母演员,我想检查他们中的一些人是否收到相同的消息。 据我所知,TestKit只有一个TestActor,所以没有办法实现这个目标吗?

这是一个例子: 父actor具有Child1,Child2和Child3 actor,由配置消息设置。 我需要检查当Parent收到Msg1消息时,它会将它发送到Child1和Child2,但不会发送到Child3。

唯一的方法是使用TestActor替换子actor,然后两次调用ExpectMsg。它会告诉我们Parent向其子节点发送消息,但是如何确保将消息发送给正确的节点?

1 个答案:

答案 0 :(得分:0)

简而言之:请参阅TestProbe类,示例here

更详细: TestKit有一个名为TestProbe的特殊类。 TestProbe具有TestActor的所有功能,然后是一些功能。作为额外的好处,您可以并行运行多个探测器。

[Test]
public void FriendsPresenceActor_should_alert_other_users_when_friend_comes_online()
{
    var presence = ActorOfAsTestActorRef<FriendsPresenceActor>("presence");

    // create probes in place of users
    var user1 = CreateTestProbe("user1");
    var user2 = CreateTestProbe("user2");
    var user3 = CreateTestProbe("user3");

    // make those probes send a message I want
    user1.Send(presence, new RegisterUser(user1));
    user2.Send(presence, new RegisterUser(user2));
    user3.Send(presence, new RegisterUser(user3));

    // pre-check we have the right number of subscribers
    Assert.AreEqual(3, presence.UnderlyingActor.Subscribers.Count);

    // trigger by having a probe send msg that I want
    user1.Send(presence, new UserOnline(user1));

    // other user probes should have been informed of new friend presence
    user1.ExpectNoMsg();
    user2.ExpectMsgFrom<UserOnline>(presence, online => online.User.Equals(user1));
    user3.ExpectMsgFrom<UserOnline>(presence, online => online.User.Equals(user1));
}

P.S。请注意AutoPilot,也可用于Akka.Net