Simulieren Sie eine Verzögerung bei der Ausführung im Komponententest mit Moq

Ich versuche Folgendes zu testen:

protected IHealthStatus VerifyMessage(ISubscriber destination)
{
    var status = new HeartBeatStatus();

    var task = new Task<CheckResult>(() =>
    {
        Console.WriteLine("VerifyMessage(Start): {0} - {1}", DateTime.Now, WarningTimeout);
        Thread.Sleep(WarningTimeout - 500);
        Console.WriteLine("VerifyMessage(Success): {0}", DateTime.Now);
        if (CheckMessages(destination))
        {
            return CheckResult.Success;
        }

        Console.WriteLine("VerifyMessage(Pre-Warning): {0} - {1}", DateTime.Now, ErrorTimeout);
        Thread.Sleep(ErrorTimeout - 500);
        Console.WriteLine("VerifyMessage(Warning): {0}", DateTime.Now);
        if (CheckMessages(destination))
        {
            return CheckResult.Warning;
        }

        return CheckResult.Error;
    });

    task.Start();

    task.Wait();
    status.Status = task.Result;

    return status;
}

mit folgendem Unit Test:

public void HeartBeat_Should_ReturnWarning_When_MockReturnsWarning()
{
    // Arrange
    var heartbeat = new SocketToSocketHeartbeat(_sourceSubscriber.Object, _destinationSubscriber.Object);
    heartbeat.SetTaskConfiguration(this.ConfigurationHB1ToHB2_ValidConfiguration());

    // Simulate the message being delayed to destination subscriber.
    _destinationSubscriber.Setup(foo => foo.ReceivedMessages).Returns(DelayDelivery(3000, Message_HB1ToHB2()));

    // Act
    var healthStatus = heartbeat.Execute();

    // Assert
    Assert.AreEqual(CheckResult.Warning, healthStatus.Status);
}

Message_HB1ToHB2 () gibt nur eine Zeichenfolge zurück und die "Delay Delivery" -Methode lautet

private List<NcsMessage> DelayDelivery(int delay, string message)
{
    var sent = DateTime.Now;
    var msg = new NcsMessage()
    {
        SourceSubscriber = "HB1",
        DestinationSubscriber = "HB2",
        SentOrReceived = sent,
        Message = message
    };

    var messages = new List<NcsMessage>();
    messages.Add(msg);

    Console.WriteLine("DelayDelivery: {0}", DateTime.Now);
    Thread.Sleep(delay);
    Console.WriteLine("DelayDelivery: {0}", DateTime.Now);

    return messages;
}

Ich verwende Moq als Verspottungs-Framework und MSTest als Test-Framework. Immer wenn ich den Komponententest durchführe, erhalte ich die folgende Ausgabe:

DelayDelivery: 04/04/2013 15:50:33
DelayDelivery: 04/04/2013 15:50:36
VerifyMessage(Start): 04/04/2013 15:50:36 - 3000
VerifyMessage(Success): 04/04/2013 15:50:38

Abgesehen von dem offensichtlichen "Codegeruch", der in den obigen Methoden mit dem Thread.Sleep erzeugt wurde, ist das Ergebnis des Komponententests nicht das, was ich erreichen möchte.

Kann jemand eine bessere / genaue Möglichkeit vorschlagen, das Moq-Framework zu verwenden, um eine Verzögerung bei der "Zustellung" der Nachricht zu simulieren. Ich habe einige der "Kleber" -Codes ausgelassen und nur die relevanten Teile eingeschlossen. Lassen Sie mich wissen, wenn ich etwas ausgelassen habe, das Sie daran hindert, die Frage zu verstehen.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage