gpt4 book ai didi

c# - 使用 Moq 模拟单元测试中的执行延迟

转载 作者:可可西里 更新时间:2023-11-01 08:30:44 24 4
gpt4 key购买 nike

我正在尝试测试以下内容:

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

使用以下单元测试:

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()只是返回一串字符,“Delay Delivery”方法是

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

我使用 Moq 作为模拟框架,使用 MSTest 作为测试框架。每当我运行单元测试时,我都会得到以下输出:

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

除了在上述方法中使用 Thread.Sleep 的明显“代码味道”之外,单元测试的结果并不是我想要完成的。

任何人都可以建议一种更好/准确的方法来使用 Moq 框架来模拟消息“传递”的延迟。我省略了一些“胶水”代码,只包含了相关部分。如果我遗漏了一些妨碍您理解问题的内容,请告诉我。

最佳答案

如果您希望 Moq 模拟只是坐下一段时间什么都不做,您可以使用回调:

Mock<IFoo> mockFoo = new Mock<IFoo>();
mockFoo.Setup(f => f.Bar())
.Callback(() => Thread.Sleep(1000))
.Returns("test");

string result = mockFoo.Object.Bar(); // will take 1 second to return

Assert.AreEqual("test", result);

我已经在 LinqPad 中尝试过,如果您调整 Thread.Sleep(),执行时间会相应变化。

关于c# - 使用 Moq 模拟单元测试中的执行延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15820760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com