首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka网络集成测试

Akka网络集成测试
EN

Stack Overflow用户
提问于 2016-03-30 16:29:43
回答 1查看 337关注 0票数 2

我有一个非常简单的场景,我想要做一个直接的集成测试。高级别概览是:

  • 我有一个actor,它响应一条名为PlaceOrder的消息
  • 我想在接收到publishes时验证此参与者PlaceOrder的另一条消息,在本例中是OrderPlaced

问题是,对于集成测试,我可以断言消息是通过ExpectMsg<OrderPlaced>发布的。但是,我也希望它也能调用处理该消息的任何参与者?

也许我对TestKit的理解在这里是不正确的,但是在继承它时,您可以得到:

  • ActorOfAsTestActorRef<T>
  • ActorOf<T>
  • Sys.ActorOf(...)

我的印象是,ActorOf<T>Sys.ActorOf(...)的行为就像一个真正的参与者系统,而ActorOfAsTestActorRef<T>对于严格的单元测试和吞下任何参与者可能发送的消息都是理想的。

举个例子,这是我的两个演员:

代码语言:javascript
复制
public class PlaceOrderActor : ReceiveActor
{
    public PlaceOrderActor()
    {
        this.Receive<PlaceOrderMessage>(
            message =>
            {
                this.Handle(message);
            });
    }

    private void Handle(PlaceOrderMessage message)
    {
        Context.ActorOf(Props.Create<Foo>()).Tell(new OrderPlaced(message.CustomerId, message.OrderItems));
    }
}

public class Foo : ReceiveActor
{
    public Foo()
    {
        this.Receive<OrderPlaced>(
            m =>
            {
            });
    }
}

我的测试看起来是这样的。奇怪的是,我必须亲自编排这个集成测试,即我检查OrderPlaced是否已经发布,然后显式地向Foo发送消息。

代码语言:javascript
复制
[TestFixture]
public class IntegrationTest : TestKit
{
    [Test]
    public void When_Placing_An_Order()
    {
        var message = new PlaceOrderMessage(
            "123",
            new List<OrderItem>
            {
                new OrderItem("Product ABC", 2)
            });

        this.ActorOfAsTestActorRef<PlaceOrderActor>().Tell(message);

        var orderPlaced = this.ExpectMsg<OrderPlaced>();

        //if (orderPlaced != null)
        //{
            //this.ActorOfAsTestActorRef<Foo>().Tell(orderPlaced);
        //}
    }
}

我期望的是,通过发送消息PlaceOrder,它应该在处理OrderPlaced时调用Foo。我不需要在测试中把这些部分注释掉吗?

这是可以做到的,还是我完全错了?

提前谢谢你,DS。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-31 12:31:29

您的PlaceOrderActor没有对FooActor的引用,它响应Sender,这是Testkit参与者。

如果希望FooActor接收OrderPlaced消息,则需要在PlaceOrderActor.Handle()方法中告诉它消息。您可能需要将FooActor创建为PlaceOrderActor的子级,或者在系统的其他地方解析对它的引用(在本例中,系统中根本没有运行FooActor )。这在你实际中是如何工作的?(非测试)系统,还是到目前为止只作为测试代码存在?

请注意,如果您将OrderPlaced消息发送到FooActor,并且不将任何消息返回给PlaceOrderActor发件人,测试方法内部将不会产生可观察到的效果,因此您的FooActor需要直接响应原始发送方,或者返回到PlaceOrderActor,而PlaceOrderActor反过来又可以响应原始发件人。

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

https://stackoverflow.com/questions/36314597

复制
相关文章

相似问题

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