У меня довольно простой сценарий, где я хочу провести прямой интеграционный тест. Обзор высокого уровня, является:Тест интеграции интеграции Akka
- У меня есть
actor
реагирующий на сообщение называетсяPlaceOrder
- Я хочу, чтобы проверить этот актер
publishes
другое сообщение при полученииPlaceOrder
, в этом случаеOrderPlaced
проблема в том, что для теста интеграции я могу утверждать, что сообщение опубликовано через ExpectMsg<OrderPlaced>
. Но я также ожидал, что он вызовет любых участников, которые тоже будут обращаться с этим сообщением?
Возможно, мое понимание TestKit
неверен здесь, но при наследовании от него вы получите:
ActorOfAsTestActorRef<T>
ActorOf<T>
Sys.ActorOf(...)
У меня сложилось впечатление, ActorOf<T>
и Sys.ActorOf(...)
бы ведут себя как настоящая актерская система, тогда как ActorOfAsTestActorRef<T>
будет идеально подходит для строго модульных тестов и проглатывает любые сообщения, которые актер может в свою очередь отправить.
Например, это мои 2 актеры в вопросе:
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
это должно invoke Foo
как он обрабатывает OrderPlaced
. Мне не нужно было бы, чтобы бит был прокомментирован в тесте?
Можно ли это сделать, или я об этом совершенно не так?
Заранее спасибо, DS.
Я был на обсервативной комнате akka net об этом, и кажется, что у меня нет действующего игрока foo, поэтому сообщение проглочено. Я верю в свою настройку, мне просто нужно добавить ActorOf Foo, и он должен работать. Вы правы, я только пробовал это с точки зрения теста. У меня есть что-то очень похожее на это в консольном приложении. –
Вы меня задумали, поэтому я создал «Клиент», который просто служит отправителем сообщений на «Сервер». Кажется, это работает нормально, т. Е. Я отправляю 'PlaceOrderMessage', который обрабатывается' PlaceOrderActor'. Затем я использую 'Context.ActorOf (Props.Create()). Сообщите (новый OrderPlaced (message.CustomerId, message.OrderItems));'. Однако при использовании TestKit это сообщение проглатывается? –
Извините, что вы правы. Созданный ребенок-актер работал с удовольствием. Проблема, с которой я просто сталкивалась, заключалась в том, что я использовал 'ActorOfAsTestActorRef', который работает по отдельному потоку в' Sys.ActorOf() '(насколько мне известно), и поэтому утверждение' ExpectMsg <> 'не срабатывало. Обновление сообщения, чтобы показать рабочее решение. –