测试的一些问题 Akka.net
Some problems with testing Akka.net
- 版本Akka.NETv1.3.8
- 版本Akka.TestKit.NUnit3 v1.3.2
- 版本 NUnit v3.10.1
- 平台Windows10
我有以下类型的演员:
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);
}
我希望在一秒钟内在指定路径上收到子演员,但我收到 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)).Result;
这里的问题是,当您告诉 UserBeingOnline
时,您正在触发异步操作 - 一条消息已发送到 branchUserActor
,但可能没有立即处理.与此同时,你正在调用 resolve one,它告诉 actor 系统找到 branchUserActor
的 child - 一个 child,它还不存在,因为 parent 没有' 尚未处理消息。
您可以使用 AwaitAssert(() => Assert.IsNotNull(ResolveChild())) 方法来处理它。
- 版本Akka.NETv1.3.8
- 版本Akka.TestKit.NUnit3 v1.3.2
- 版本 NUnit v3.10.1
- 平台Windows10
我有以下类型的演员:
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);
}
我希望在一秒钟内在指定路径上收到子演员,但我收到 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)).Result;
这里的问题是,当您告诉 UserBeingOnline
时,您正在触发异步操作 - 一条消息已发送到 branchUserActor
,但可能没有立即处理.与此同时,你正在调用 resolve one,它告诉 actor 系统找到 branchUserActor
的 child - 一个 child,它还不存在,因为 parent 没有' 尚未处理消息。
您可以使用 AwaitAssert(() => Assert.IsNotNull(ResolveChild())) 方法来处理它。