2015-11-16 2 views
0

Я тестирую с помощью NUnit. Что я делаю не так?Akka.NET TestKit получение ошибки таймаута

public class ZipActor : ReceiveActor 
{ 
    public ZipActor() 
    { 
     Receive<ZipMessage>(message => HandleZipMessage(message)); 
    } 

    private void HandleZipMessage(ZipMessage message) 
    { 
     Console.WriteLine(string.Format("Received: {0} for {1}", typeof(ZipMessage).Name, message.SourceFolderPath)); 
    } 
} 

public class ZipMessage 
{ 
    public readonly string SourceFolderPath; 

    public ZipMessage(string sourceFolderPath) 
    { 
     SourceFolderPath = sourceFolderPath; 
    } 
} 

[TestFixture] 
public class ZipActorTests : TestKit 
{ 
    [Test] 
    public void ZipActor_WhenSentZipMessage_ShouldReceiveZipMessage() 
    { 
     var actor = Sys.ActorOf(Props.Create(() => new ZipActor())); 
     string path = "some path"; 

     actor.Tell(new ZipMessage(path)); 

     ExpectMsg<ZipMessage>(); 
    } 
} 

Я получаю эту ошибку:

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

Это то, что я получаю в NUnit'sconsole вывод. Поступило в редакцию: ZipMessage для некоторого пути [WARNING] [16/11/2015 18:46:37] [Тема 0012] [akka: // test/user] DeadLetter из [akka: // test/user] в [akka : // test/user]:: [akka: // test/user/$ b], ExistenceConfirmed = True, AddressTerminated = False>

ответ

0

ОК, поэтому я получил неправильный конец палки, и это имеет смысл, когда я фактически добавляю конечную линию HandleZipMessage, которую я пропустил. Мой тест на самом деле аналогичен этому сообщению - Testing Akka.NET's Context.Parent with TestKit. Так что мне нужно было сделать это, что работает. :)

public class ZipActor : ReceiveActor 
{ 
    public ZipActor() 
    { 
     Receive<ZipMessage>(message => HandleZipMessage(message)); 
    } 

    private void HandleZipMessage(ZipMessage message) 
    { 
     Console.WriteLine(string.Format("Received: {0} for {1}", typeof(ZipMessage).Name, message.SourceFolderPath)); 
     // TODO: Zip operations 
     Context.Parent.Tell(new IncrementFolderCountMessage()); 
    } 
} 

public class ZipMessage 
{ 
    public readonly string SourceFolderPath; 

    public ZipMessage(string sourceFolderPath) 
    { 
     SourceFolderPath = sourceFolderPath; 
    } 
} 

[TestFixture] 
public class ZipActorTests : TestKit 
{ 
    [Test] 
    public void ZipActor_WhenReceivedZip_ShouldIncrementFolderCount() 
    { 
     // Arrange 
     // (make ZipActor child of TestActor) 
     var props = Props.Create(() => new ZipActor()); 
     var actor = ActorOfAsTestActorRef<ZipActor>(props, TestActor); 

     string path = "some path"; 

     // Act 
     actor.Tell(new ZipMessage(path)); 

     // Assert 
     ExpectMsg<IncrementFolderCountMessage>(); 
    } 
} 
2

Вы недопонимаете, какой актер является субъектом ExpectMsg(). Вызывается вызов ExpectMsg на TestActor, который является по умолчанию/неявным отправителем всех сообщений в тестах TestKit.

Таким образом, ошибка заключается в том, что вы сообщаете TestKit, что TestActor должен ожидать ZipMessage. Чтобы быть ясным, как написано, говорится, что TestActor должен получить ZipMessage. Это не означает, что сообщение ZipActor должно получить это сообщение. Тайм-аут, на который вы нажимаете, по умолчанию: 03 таймаут, который TestActor относится к его вызову ExpectMsg.

Чтобы пройти тест, как он настроен сейчас, вам нужно будет Sender.Tell(new ZipMessage("foopath")) изнутри ZipActor.

В целом справедливо, что документы проекта для TestKit в настоящее время отсутствуют (с 11/16/15). Мы сейчас написали их, и они должны быть опубликованы на следующей неделе.

На данный момент я предлагаю вам ознакомиться с this thorough intro to the TestKit (раскрытие: Я написал). Я думаю, это даст вам очень четкое представление о том, как работает TestKit.

+0

Привет, Андрей, я прочитал ваше сообщение, но я не читал его достаточно внимательно! Теперь я опубликовал свое собственное решение. :) –

Смежные вопросы