Simuler un retard dans l'exécution de l'Unité de Test à l'aide de Moq

Je suis en train de tester le suivant:

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;
}

avec l'appareil de 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() renvoie une chaîne de caractères et le "Délai de Livraison" la méthode est

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;
}

Je suis en utilisant Moq comme le moqueur cadre et MSTest que l'infrastructure de test. Chaque fois que je lance le test de l'unité, j'obtiens le résultat suivant:

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

Au-delà de l'évident "odeur de code" à l'aide du Fil.Dormir dans les méthodes ci-dessus, le résultat de l'unité de test n'est pas ce que je suis en train d'accomplir.

Quelqu'un peut-il suggérer une meilleure exactes façon d'utiliser le Moq cadre de simuler un délai de "livraison" du message. J'ai laissé de côté une partie de la "colle" de code et ne comprenaient que les parties pertinentes. Laissez-moi savoir si quelque chose que j'ai laissé de côté qui vous empêche d'être en mesure de comprendre la question.

Vous seriez mieux de créer un exemple de quelqu'un (autre que vous) peut s'exécuter qu'un aperçu de ce que vous essayez d'accomplir. Il n'y a rien ici, quelqu'un pourrait copier et exécuter sans faire un bouquet de travaux supplémentaires.

OriginalL'auteur Julian Easterling | 2013-04-04