【问题标题】:Some problems with testing Akka.net测试 Akka.net 的一些问题
【发布时间】:2018-07-13 04:37:41
【问题描述】:
  • 版本 Akka.NET v1.3.8
  • 版本 Akka.TestKit.NUnit3 v1.3.2
  • 版本 NUnit v3.10.1
  • 平台 Windows 10

我有以下类型的演员:

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));
    }
}

在测试这个演员时,我希望我会有一个子演员。 我正在编写下一个测试来检查这种情况(使用 NUnit 框架):

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

    var expectedChildActor = Sys.ActorSelection($"{actorPath}/user_{userId.AkkaPrepare()}")
        .ResolveOne(TimeSpan.FromSeconds(1)).Result;

    Assert.IsNotNull(expectedChildActor);
}

我希望在一秒钟内收到指定路径上的子actor,但我得到了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 次测试失败,因为我得到一个 ActorNotFoundException。 但我想知道为什么第一个选项不能按我预期的方式工作?

我做错了吗?

提前感谢您的回答。

【问题讨论】:

    标签: akka.net


    【解决方案1】:
    branchUserActor.Tell(UserBeingOnline.Create(userId, branchId));
    
    var expectedChildActor = Sys.ActorSelection($"{actorPath}/user_{userId.AkkaPrepare()}")
      .ResolveOne(TimeSpan.FromSeconds(1)).Result;
    

    这里的问题是,当您告诉UserBeingOnline 时,您正在触发一个异步操作——一条消息已发送到branchUserActor,但它可能没有立即得到处理。与此同时,您正在调用 resolve one,它告诉 actor 系统找到 branchUserActor 的一个子代 - 一个尚未出现的子代,因为父代尚未处理该消息。

    您可以使用AwaitAssert(() => Assert.IsNotNull(ResolveChild())) 方法来处理它。

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-22
      相关资源
      最近更新 更多