我有一个非常简单的场景,我想要做一个直接的集成测试。高级别概览是:
actor,它响应一条名为PlaceOrder的消息publishes时验证此参与者PlaceOrder的另一条消息,在本例中是OrderPlaced问题是,对于集成测试,我可以断言消息是通过ExpectMsg<OrderPlaced>发布的。但是,我也希望它也能调用处理该消息的任何参与者?
也许我对TestKit的理解在这里是不正确的,但是在继承它时,您可以得到:
ActorOfAsTestActorRef<T>ActorOf<T>Sys.ActorOf(...)我的印象是,ActorOf<T>和Sys.ActorOf(...)的行为就像一个真正的参与者系统,而ActorOfAsTestActorRef<T>对于严格的单元测试和吞下任何参与者可能发送的消息都是理想的。
举个例子,这是我的两个演员:
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发送消息。
[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。
发布于 2016-03-31 12:31:29
您的PlaceOrderActor没有对FooActor的引用,它响应Sender,这是Testkit参与者。
如果希望FooActor接收OrderPlaced消息,则需要在PlaceOrderActor.Handle()方法中告诉它消息。您可能需要将FooActor创建为PlaceOrderActor的子级,或者在系统的其他地方解析对它的引用(在本例中,系统中根本没有运行FooActor )。这在你实际中是如何工作的?(非测试)系统,还是到目前为止只作为测试代码存在?
请注意,如果您将OrderPlaced消息发送到FooActor,并且不将任何消息返回给PlaceOrderActor发件人,测试方法内部将不会产生可观察到的效果,因此您的FooActor需要直接响应原始发送方,或者返回到PlaceOrderActor,而PlaceOrderActor反过来又可以响应原始发件人。
https://stackoverflow.com/questions/36314597
复制相似问题