2015-10-19 2 views
2

Я новичок в Akka.NET, на данный момент у меня возникают трудности с тестированием, если мой актер отправил сообщение самому себе.Тестирование сообщения о себе отправлено в Akka.NET

Это мой актер код:

public class MySuperActor : ReceiveActor 
{ 
    private readonly IActorRef _anotherActor; 

    public RoteadorDeContratosSuspensoActor(IActorRef anotherActor) 
    { 
     _anotherActor = anotherActor; 
     Receive<MySuperActorMessage>(m => HandleMessage(m)); 
     Receive<MySuperActorSuperMessage>(m => HandleSuperMessage(m)); 
    } 

    private void HandleMessage(MySuperActorMessage message) 
    { 
     Self.Tell(new MySuperActorSuperMessage(message)); 
    } 

    private void HandleSuperMessage(MySuperActorSuperMessage message) 
    { 
     _anotherActor.Tell(new AnotherActorMessage(message)); 
    } 
} 

И это мой тестовый код

[TestFixture] 
public class MySuperActorTest : TestKit 
{ 
    private IActorRef _sut; 
    private IActorFactory _actorFactory; 
    private List<Contrato> _contratos; 
    private Props _props; 

    [Test] 
    public void WhenReceiveASimpleMessageActorShouldSendSuperMessageToHimself() 
    { 
     var testProbe = CreateTestProbe(); 
     Props props = Props.Create<MySuperActor>(testProbe); 
     var sut = ActorOf(_props); 
     sut.Tell(new MySuperActorMessage()); 

     ExpectMsg<MySuperActorSuperMessage>(); 
    } 
} 

Мой тест всегда перерыв со следующим сообщением:

Failed: Тайм-аут 00:00 : 03 в ожидании сообщения типа AkkaNetTestPlaygroung.MySuperActorSuperMessage

Как я могу проверить, посылает ли мой актер другое сообщение самому себе?

ответ

2

Alberto.

Фактически, вызов метода ExpectMsg() в вашем тестовом методе ожидает, что сообщение будет отправлено обратно в вашу тестовую систему актеров (я имею в виду контекст, на который был отправлен исходный MySuperActorMessage), но не экземпляр MySuperActor. Было бы лучше (и вернее) ожидать экземпляр AnotherActorMessage на вашем тестовом зонде, который вы создадите в своем тесте.

Вот метод испытания, которые проходят:

[Test] 
    public void WhenReceiveASimpleMessageActorShouldSendSuperMessageToHimself() 
    { 
     var testProbe = this.CreateTestProbe(); 
     var props = Props.Create<MySuperActor>(testProbe); 
     var sut = this.Sys.ActorOf(props); 
     sut.Tell(new MySuperActorMessage()); 

     testProbe.ExpectMsg<AnotherActorMessage>(); 
    } 
+0

@ Усеина-mambediev У меня есть этот тест в моем коде, я хотел бы знать, как проверить правильно, если какой-то актер послал сообщение самому себе. Иногда у меня может быть какой-то код, в котором у меня нет другого актера для использования testprobe и expectmsg. Спасибо за ваш комментарий Atm Я решил решить вопрос, используя другого актера, чтобы отправить сообщение * самому себе * –

+0

@AlbertoMonteiro, я считаю, что в настоящее время нет возможности проверить такие сообщения. Единственный возможный способ - проверить сообщения, отправленные с тестируемого актера, другим участникам (тестовым пробникам) или проверить, были ли вызваны зависимости (с использованием mocks). –

+0

@ usein-mambediev Да, я получил это, я действительно делаю это, и когда я проверяю, были ли вызваны зависимости, я использую '' '' ExpectNoMsg''', чтобы дождаться выполнения актера и проверить, вызван ли метод dependecie. Спасибо за помощь –