测试Akka.net的一些问题 版本Akka.NET v1.3.8 版本Akka.TestKit.NUnit3 v1.3.2 版本NUnit v3.10.1 平台Windows 10

测试Akka.net的一些问题 版本Akka.NET v1.3.8 版本Akka.TestKit.NUnit3 v1.3.2 版本NUnit v3.10.1 平台Windows 10,akka.net,Akka.net,我有一个以下类型的演员: public class BranchUsersActor : ReceiveActor { public BranchUsersActor() { Receive<UserBeingOnline>((online) => { var userActorName = $"user_{online.UserId}"; if (Context.Child(use

我有一个以下类型的演员:

public class BranchUsersActor : ReceiveActor
{
    public BranchUsersActor()
    {
        Receive<UserBeingOnline>((online) =>
        {
            var userActorName = $"user_{online.UserId}";
            if (Context.Child(userActorName).Equals(ActorRefs.Nobody))
            {                
                var user = Context.ActorOf(UserActor.Props(online.UserId, online.BranchId), userActorName);
                user.Tell(online);                    
            }
        });
    }

    public static Props Props(LoggingTags tags)
    {
        return Akka.Actor.Props.Create(() => new BranchUsersActor(tags));
    }
}
我希望在一秒钟内,我将在指定的路径上接收子参与者,但我得到的是ActorNotFoundExpection

如果我在做这样的事情:

[Test]
public void Test()
{
    var branchUserActor = Sys.ActorOf(BranchUsersActor.Props());
    branchUserActor.Tell(UserBeingOnline.Create(userId, branchId));

    Task.Delay(100).ContinueWith(_ => 
    {
        var expectedChildActor = Sys.ActorSelection($"{actorPath}/user_{userId.AkkaPrepare()}")`enter code here`
            .ResolveOne(TimeSpan.FromSeconds(1)).Result;
    }
    Assert.IsNotNull(expectedChildActor);    
}
这很好,但是10次测试中有1次失败,因为我得到一个ActorNotFoundException。 但我想知道为什么第一个选项没有按我预期的方式工作

我做错什么了吗

提前感谢您的回答。

branchUserActor.Tell(UserBeingOnline.Create(userId,branchId));
var expectedChildActor=Sys.ActorSelection($“{actorPath}/user{userId.AkkaPrepare()}”)
.ResolveOne(TimeSpan.FromSeconds(1))结果;
这里的问题是,当您告诉
UserBeingOnline
时,您触发了一个异步操作-一条消息已发送到
branchUserActor
,但可能尚未立即处理。与此同时,您正在调用resolve one,它告诉actor系统查找
branchUserActor
的子级,该子级还不存在,因为父级尚未处理消息

您可以使用该方法来处理该问题

[Test]
public void Test()
{
    var branchUserActor = Sys.ActorOf(BranchUsersActor.Props());
    branchUserActor.Tell(UserBeingOnline.Create(userId, branchId));

    Task.Delay(100).ContinueWith(_ => 
    {
        var expectedChildActor = Sys.ActorSelection($"{actorPath}/user_{userId.AkkaPrepare()}")`enter code here`
            .ResolveOne(TimeSpan.FromSeconds(1)).Result;
    }
    Assert.IsNotNull(expectedChildActor);    
}