Ich versuche folgendes zu prüfen:Simulieren eine Verzögerung bei der Ausführung in Unit-Test unter Verwendung Moq
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 dem 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() gibt nur eine Reihe von Zeichen und das „Delay 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 Moq als Mockframework und MSTest als testin bin mit g Rahmen. Jedes Mal, wenn ich das Gerät Test ausführen, ich 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
über den Tellerrand hinaus „Codegeruch“ über die Thread.Sleep in den Verfahren verwendet wird, ist das Ergebnis des Unit-Tests nicht, was ich versuche erreichen.
Kann jemand vorschlagen eine bessere/genaue Möglichkeit, das Moq-Framework zu verwenden, um eine Verzögerung in "Lieferung" der Nachricht zu simulieren. Ich habe etwas vom "Kleber" -Code weggelassen und nur die relevanten Teile eingeschlossen. Lassen Sie mich wissen, wenn etwas, das ich weggelassen habe, Sie daran hindert, die Frage zu verstehen.
Sie wäre besser dran, ein Beispiel zu erstellen jemand (anders als Sie) kann tatsächlich, dass Highlights, was Sie versuchen, zu erreichen. Es gibt hier nichts, was jemand kopieren und laufen könnte, ohne eine Menge zusätzlicher Arbeit zu leisten. –