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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie möchten, eine Moq mock, einfach nur sitzen und nichts tun für eine Weile, können Sie einen Rückruf:
Ich habe versucht, dass in LinqPad und wenn Sie passen Sie die
Thread.Sleep()
die Ausführungszeit variiert entsprechend.Bar()
dann die beidenCallback
s ausgeführt werden nachdem beideBar()
s abgeschlossen.Wenn Sie Ihre setup mock kann man sagen der thread in der return func:
Konnte ich nicht Moq-version zu arbeiten, so dass ich endete, dass so etwas wie dieses:
einem kleinen Beispiel mit WaitHandle:
Ich mag und habe für serup-Lösung. Meine Antwort ist eine version der seine umgebaut für die Nutzung als Bibliothek.
Ich hatte eine ähnliche situation, aber mit einer Async-Methode. Was für mich gearbeitet wurde, Folgendes zu tun: