Simulieren eine Verzögerung in der Ausführung in Unit-Test mit Moq

Ich versuche zum test das folgende:

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 der folgenden 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() nur einen string zurückgibt der Charaktere und die "Verzögerung Delivery" - Methode ist

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 bin mit Moq wie das mocking framework und MSTest als Test-framework. Wenn ich das Gerät testen, ich bekomme 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

Jenseits des offensichtlichen "code smell" mit dem Thread.Schlaf in den obigen Methoden, ist das Ergebnis der unit-test ist nicht das, was ich versuche zu erreichen.

Kann jeder jeden schlagen eine bessere/genaue Weg, um das Moq-framework zum simulieren einer Verzögerung bei der "Lieferung" von der Nachricht. Ich habe einige der "glue-code" und nur die relevanten Teile. Lassen Sie mich wissen, wenn etwas habe ich ausgelassen, die verhindert, dass Sie in der Lage, die Frage zu verstehen.

  • Sie wären besser dran, erstellen einer Beispiel jemand (außer Ihnen) überhaupt ausführen kann, die zeigt, was Sie versuchen zu erreichen. Es gibt hier nichts, jemand könnte kopieren und ausführen, ohne dabei einen Haufen extra-Arbeit.
Schreibe einen Kommentar