rov*_*red 6 c# unit-testing asynchronous moq async-await
在我的单元测试中,我试图Run()从我的界面模拟出异步方法IPipeline并模拟延迟,它在类中被调用PipelineScheduler
public interface IPipeline
{
Task Run();
}
Run Code Online (Sandbox Code Playgroud)
测试起订量:
[SetUp]
public void SetUp()
{
_mockPipeline = new Mock<IPipeline>();
_mockPipeline.Setup(x => x.Run()).Returns(async () =>
{
await Task.Delay(3000);
});
_scheduler = new PipelineScheduler(_mockPipeline.Object);
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在调用模拟方法的地方运行测试和调试时
await _pipeline.Run().ConfigureAwait(false);
Run Code Online (Sandbox Code Playgroud)
没有延迟,在此行之后立即继续执行。
但是如果我用存根类替换模拟,延迟工作正常。
private class MockPipeline : IPipeline
{
public async Task Run()
{
await Task.Delay(3000);
}
}
[SetUp]
public void SetUp()
{
_mockPipeline = new MockPipeline();
_scheduler = new PipelineScheduler(_mockPipeline);
}
Run Code Online (Sandbox Code Playgroud)
所以我想问题是我如何用最小起订量与我的存根类创建延迟有什么不同?
区别在于设置配置不正确。
返回一个任务,即:.Returns(Task.Delay(3000));是设置达到预期目的所需的全部。前面的设置是一劳永逸的,async void这就是前面的示例没有等待并立即继续的原因。
以下最小示例演示了如何设置模拟
[TestClass]
public class MyTestClass {
[TestMethod]
public async Task MyTestMethod() {
//Arrange
var _mockPipeline = new Mock<IPipeline>();
_mockPipeline.Setup(x => x.Run()).Returns(Task.Delay(3000)).Verifiable();
var sut = new PipelineScheduler(_mockPipeline.Object);
//Act
await sut.MethodUnderTest();
//Assert
_mockPipeline.Verify();
}
}
public interface IPipeline {
Task Run();
}
public class PipelineScheduler {
private IPipeline _pipeline;
public PipelineScheduler(IPipeline pipeline) {
this._pipeline = pipeline;
}
public async Task MethodUnderTest() {
await _pipeline.Run().ConfigureAwait(false);
}
}
Run Code Online (Sandbox Code Playgroud)
执行时,测试会延迟配置的 3 秒。