Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 异步方法的Moq返回延迟未延迟_C#_Unit Testing_Asynchronous_Async Await_Moq - Fatal编程技术网

C# 异步方法的Moq返回延迟未延迟

C# 异步方法的Moq返回延迟未延迟,c#,unit-testing,asynchronous,async-await,moq,C#,Unit Testing,Asynchronous,Async Await,Moq,在我的单元测试中,我试图从接口ipepeline模拟Run()async方法,并模拟一个延迟,在类PipelineScheduler中调用它 public interface IPipeline { Task Run(); } 试验最小起订量: [SetUp] public void SetUp() { _mockPipeline = new Mock<IPipeline>(); _mockPipeline.Setup(x => x.Run()).R

在我的单元测试中,我试图从接口
ipepeline
模拟
Run()
async方法,并模拟一个延迟,在类
PipelineScheduler
中调用它

public interface IPipeline
{
    Task Run();
}
试验最小起订量:

[SetUp]
public void SetUp()
{
    _mockPipeline = new Mock<IPipeline>();

    _mockPipeline.Setup(x => x.Run()).Returns(async () =>
    {
        await Task.Delay(3000);
    });
    _scheduler = new PipelineScheduler(_mockPipeline.Object);
}
没有延迟,在这一行之后立即继续执行

但是如果我用存根类替换mock,那么延迟就可以了

private class MockPipeline : IPipeline
{
    public async Task Run()
    {
        await Task.Delay(3000);
    }
}

[SetUp]
public void SetUp()
{
    _mockPipeline = new MockPipeline();
    _scheduler = new PipelineScheduler(_mockPipeline);
}

因此,我想问题是,我用moq和stubbed类创建延迟有什么不同?

不同之处在于设置配置不正确

返回任务,即:
.Returns(Task.Delay(3000))是设置执行所需操作所需的全部内容。前面的设置是一个fire-and-forget
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);

    }
}
[TestClass]
公共类MyTestClass{
[测试方法]
公共异步任务MyTestMethod(){
//安排
varu mockPipeline=new Mock();
_mockPipeline.Setup(x=>x.Run()).Returns(Task.Delay(3000)).Verifiable();
var sut=new PipelineScheduler(_mockPipeline.Object);
//表演
等待sut.MethodUnderTest();
//断言
_mockPipeline.Verify();
}
}
公共接口{
任务运行();
}
公共类PipelineScheduler{
私营伊皮佩林管道;
公共管道调度器(IPipeline管道){
这条管道=管道;
}
公共异步任务MethodUnderTest(){
wait _pipeline.Run().configurewait(false);
}
}

练习时,测试会延迟配置的3秒钟。

一个老问题,但我刚刚遇到了问题,正确的方法是而不是接受的答案。正确的方法是在返回中使用函数

i、 e

如果没有
()=>
,延迟只应用一次,即使您执行多个连续调用,例如,如果您执行以下操作:

await _pipeline.Run().ConfigureAwait(false);
await _pipeline.Run().ConfigureAwait(false);
await _pipeline.Run().ConfigureAwait(false);

请在dotnetfiddle.net上查看此内容

.Returns(Task.Delay(3000))是设置执行所需操作所需的全部内容。前面的设置是一个fire-and-forget
async-void
,然后这就是答案,仍然看不出问题中缺少什么。也许可以稍微调整一下,但主体就在那里。
.Returns(() => Task.Delay(3000))
await _pipeline.Run().ConfigureAwait(false);
await _pipeline.Run().ConfigureAwait(false);
await _pipeline.Run().ConfigureAwait(false);