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.
OriginalL'auteur Julian Easterling | 2013-04-04
Vous devez vous connecter pour publier un commentaire.
Si vous voulez une Moq se moquer de tout simplement s'asseoir et ne rien faire pendant un certain temps, vous pouvez utiliser un rappel:
J'ai essayé que dans LinqPad et si vous ajustez la
Thread.Sleep()
le temps d'exécution varie en conséquence.cela ne semble pas fonctionner pour moi, je pense que le rappel est exécuté après le résultat est renvoyé par le Moq
Je suis d'accord avec @DanDinu - si vous exécutez deux appels simultanés à
Bar()
puis les deuxCallback
s sont exécutées après les deuxBar()
s complet.Pour ceux qui ne sont pas en mesure d'obtenir que cela fonctionne: Le rappel ne sera exécuté avant la moqué de méthode, si vous vous moquez du rappel avant de vous moquer de retour d'appel (selon le Moq documentation "rappels peuvent être spécifiés avant et après l'invocation"). Si vous êtes en se moquant d'une méthode void, alors je crains que vous êtes hors de la chance, car le rappel sera toujours exécuté après la moqué de méthode s'exécute.
1000 est un temps long pour un test à exécuter. Ce doit être configuré pour s'exécuter jusqu'à ce qu'il est dit d'arrêter. Envisager de remplacer le Fil de discussion.Le sommeil de la Tâche.Retard
OriginalL'auteur Adam Rodger
Lorsque vous configurez votre fantaisie, vous pouvez dire le fil de dormir dans le retour func:
OriginalL'auteur Susanne Peng
Je ne pouvais pas obtenir Moq version de travail, j'ai donc fini par faire quelque chose comme ceci:
un petit exemple d'utilisation WaitHandle:
OriginalL'auteur serup
J'aime, et ont voté pour serup de la solution. Ma réponse est une version de son transformée en bibliothèque.
OriginalL'auteur Jacob Brewer
J'ai eu une situation similaire, mais avec une méthode Asynchrone. Ce qui a fonctionné pour moi a été de faire ce qui suit:
OriginalL'auteur Louis Cribbins