Akka.net и модульные тесты

Я хотел бы использовать Akka.net TestKit для написания модульных тестов, но у меня есть вопрос. У меня есть класс SubscriptionService, который отвечает за передачу сообщений выбранным акторам.

public class SubscriptionService : ReceiveActor
{
    private readonly ActorSelection service1;

    private readonly ActorSelection service2;

    public SubscriptionService()
    {
        this.service1 = Context.ActorSelection("Service1");
        this.service2 = Context.ActorSelection("Service2");

        this.Receive<RequestMessage>(message => this.ProcessRequestMessage(message));
    }

    private void ProcessRequestMessage(RequestMessage message)
    {
        this.service1.Tell(message);
        this.service2.Tell(message);
    }

Как я могу проверить это поведение? Я создал этот тест, но в этом тесте я получаю исключение. "Дополнительная информация: Ошибка Assert.Fail. Ошибка: тайм-аут 00:00:03 при ожидании сообщения"

[TestClass]
public class SubscriptionServiceUnitTests : TestKit
{
    [TestMethod]
    public void Test1()
    {
        var subscriptionServiceRef = this.ActorOfAsTestActorRef<SubscriptionService>("SubscriptionService");

        subscriptionServiceRef.Tell(new RequestMessage());

        var answer = this.ExpectMsg<RequestMessage>();
    }

Я имею в виду, как я могу получить сообщение для service1 и service2 в методе Test1?


person user45245    schedule 28.06.2015    source источник


Ответы (1)


ExpectMsg работает только в сочетании с актером особого типа под названием TestActor. Вы можете получить доступ/создать его из тестового комплекта. Его роль состоит в том, чтобы перехватывать и проверять отправляемые ему сообщения.

Если вы немного перепроектируете свой SubscriptionService актор, вы можете передать ему тестовые ссылки на актор. Самый простой способ сделать это — просто внедрить ссылки на актера через конструктор актера — я использовал интерфейс ICanTell, который является более общей формой, реализуемой как ссылками на актера, так и выбором актера:

public class SubscriptionService : ReceiveActor
{
    private readonly ICanTell service1;
    private readonly ICanTell service2;

    public SubscriptionService(ICanTell service1, ICanTell service2)
    {
        this.service1 = service1;
        this.service2 = service2;
        this.Receive<RequestMessage>(message => this.ProcessRequestMessage(message));
    }

Таким образом, вы можете создать своего актера, используя:

Context.ActorOf(Props.Create(() => new SubscriptionService(Context.ActorSelection("Service1"), Context.ActorSelection("Service2")));

Чтобы протестировать его, в своем классе спецификации TestKit инициализируйте его с помощью TestActor или TestProbe.

person Bartosz Sypytkowski    schedule 28.06.2015