首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka.Net测试儿童演员的TestKit创作/监督

Akka.Net测试儿童演员的TestKit创作/监督
EN

Stack Overflow用户
提问于 2015-10-23 10:47:07
回答 1查看 1.8K关注 0票数 1

我有类似于下面的Akka.Net代码,我正在尝试为它编写测试:

代码语言:javascript
复制
public class DoesSomethingActor : UntypedActor
{
    protected override void OnReceive(object message)
    {

    }
}

public class ForwardsMessagesActor : UntypedActor
{
    protected override void OnReceive(object message)
    {
        var actor = Context.ActorOf(Context.DI().Props<DoesSomethingActor>(), "DoesSomethingWorker");

        for (int i = 0; i < 5; i++)
        {
            actor.Tell(message + " " + i);
        }
    }
}

我已经完成了这个测试,但是我显然遗漏了一些东西,因为我根本没有使用太多的TestKit。关于如何使用TestKit测试这个问题,还没有正式的文档吗?

代码语言:javascript
复制
//creating actor mocks with Moq seems to confuse Akka - it just doesn't work 
//but creating mock classes manually like this, 
//then configuring them in the DI container works
public class DoesSomethingActorSpy : DoesSomethingActor
{
    public static List<object> ReceivedMessages = new List<object>();

    protected override void OnReceive(object message)
    {
        ReceivedMessages.Add(message);
    }
}

    [TestMethod]
    public void ForwardsMessagesActor_Creates5Messages()
    {
        //set up DI container to use DoesSomethingActorSpy as a child actor
        ContainerBuilder builder = new ContainerBuilder();
        builder.RegisterType<ForwardsMessagesActor>();
        builder.RegisterType<DoesSomethingActorSpy>().As<DoesSomethingActor>();
        IContainer container = builder.Build();

        var propsResolver = new AutoFacDependencyResolver(container, Sys);

        var actor = ActorOfAsTestActorRef<ForwardsMessagesActor>(propsResolver.Create<ForwardsMessagesActor>());

        actor.Tell("Test");

        //this looks wrong, I probably should be using something from TestKit
        Thread.Sleep(10);

        CollectionAssert.AreEquivalent(
            new[] { "Test 0", "Test 1", "Test 2", "Test 3", "Test 4" },
            DoesSomethingActorSpy.ReceivedMessages);
    }

我应该如何创造模拟演员?在TestKit上有什么方法我可以调用等待直到所有消息都被处理了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-11-17 17:48:52

引用自Akka.TestKit

测试父/子关系更为复杂。在这种情况下,Akka.NET提供简单抽象的承诺使得测试更加困难。 测试这种关系的最简单方法是使用消息传递。例如,您可以创建一个父角色,其子角色在启动时向另一个参与者发送消息。或者,您可以让家长将一条消息转发给孩子,然后孩子可以回复原始发件人,例如: 公共类ChildActor : ReceiveActor { public ChildActor() { ReceiveAny(o => Sender.Tell("hello!"));}公共类ParentActor : ReceiveActor { public ParentActor() { var child = Context.ActorOf(Props.Create(() => new ChildActor();ReceiveAny(o => child.Forward(o));} TestFixture公共类ParentGreeterSpecs : TestKit {TestKit void Parent_should_create_child() { //验证子消息是通过发送消息//创建的,该消息//被转发给子发送方,并且哪个子响应具有var parentProps = Props.Create(() =>新ParentActor());var = ActorOfAsTestActorRef(parentProps,TestActor);parent.Tell(“这应该转发给子节点”);ExpectMsg(“你好!”);} 关于测试父母/子女关系的警告 避免将代码与层次结构过度耦合! 过度测试父/子关系可以将测试与层次结构实现相结合。这会增加以后重构代码的成本,因为这会迫使许多测试重写。您需要在验证您的意图和测试您的实现之间取得平衡。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33300499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档