gpt4 book ai didi

c# - 模拟任务.延迟

转载 作者:太空狗 更新时间:2023-10-29 20:07:01 32 4
gpt4 key购买 nike

我有一个包含以下行的方法:await Task.Delay(waitTime).ConfigureAwait(false);

我有一个很好的策略来避免在单元测试时实际等待几秒钟,而是验证我们是否尝试等待特定的秒数。

例如,有没有一种方法可以将附加参数注入(inject)到我的方法中,就像在这个(人为的)示例中,我注入(inject)了一个虚构的 ITaskWaiter 接口(interface)的模拟对象:

// Arrange
var mockWait = new Mock<ITaskWaiter>(MockBehavior.Strict);
mockWait.Setup(w => w.Delay(It.Is<TimeSpan>(t => t.TotalSeconds == 2)));

// Act
myObject.MyMethod(mockWait.Object);

// Assert
mockWait.Verify();

最佳答案

你可以像这样定义一个“延迟器”接口(interface):

public interface IAsyncDelayer
{
Task Delay(TimeSpan timeSpan);
}

然后您可以为生产代码提供以下实现:

public class AsyncDelayer : IAsyncDelayer
{
public Task Delay(TimeSpan timeSpan)
{
return Task.Delay(timeSpan);
}
}

现在,你的类看起来像这样:

public class ClassUnderTest
{
private readonly IAsyncDelayer asyncDelayer;

public ClassUnderTest(IAsyncDelayer asyncDelayer)
{
this.asyncDelayer = asyncDelayer;
}

public async Task<int> MethodUnderTest()
{
await asyncDelayer.Delay(TimeSpan.FromSeconds(2));

return 5;
}
}

这是 Dependency Injection 的基本应用.基本上,我们提取了异步等待不同类的逻辑,并为其创建了一个接口(interface)来启用 polymorphism。 .

在生产中,您可以像这样组合您的对象:

var myClass = new ClassUnderTest(new AsyncDelayer());

现在,在您的测试中,您可以创建一个像这样立即返回的虚假延迟器:

[TestMethod]
public async Task TestMethod1()
{
var mockWait = new Mock<IAsyncDelayer>();

mockWait.Setup(m => m.Delay(It.IsAny<TimeSpan>())).Returns(Task.FromResult(0));

var sut = new ClassUnderTest(mockWait.Object);

var result = await sut.MethodUnderTest();

Assert.AreEqual(5, result);
}

关于c# - 模拟任务.延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40537996/

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