如何在 C# 中模拟(等待)System.Threading.Tasks.Task<EMCResponse>

how to mock (awaitable) System.Threading.Tasks.Task<EMCResponse> in c#

我是 C# 的新手,一直在尝试模拟 System.Threading.Tasks.Task<EMCResponse> 类型的对象,但未能成功。谁能帮我如何嘲笑?

public class PEProcessor : IPEProcessor
{
    public PEProcessor(IService service)
    {
        _proxy = service;
        _emUpdate = new EMUpdate(service);
    }


    public void CreateAddress(string modelName, string version, string name, MType mType, Address address, EMRequest request)
    {
        var response = _proxy.EMCreateAsync(request); // should return object of type (awaitable) System.Threading.Tasks.Task<EMCResponse>
        address.Id = Convert.ToInt32(response.Result.CM[0].Code);
    }

}

我在嘲讽如下

[Fact]
public void RequestIsVerifiable()
{

    //Arrange
    var wcfMock = new Mock<IService>();

    // wcfMock.Setup(x => x.EMCreateAsync(It.IsAny<EMCreateRequest>())).ReturnAsync(??);

    //Act
    var peProcessor = new PEProcessor(wcfMock.Object);
    peProcessor.CreateAddress(MoqData.ModelName, MoqData.version, MoqData.name,
        MoqData.MType, MoqData.AddressesList(), MoqData.EMRequest);

    //Assert
    wcfMock.Verify(service => service.EMCreateAsync(It.IsAny<EMCreateRequest>()), Times.AtLeastOnce);
}

提前致谢!!

如果你只想延迟一些结果或执行来模拟正在异步完成的事情,你可以只使用:

await Task.Delay(5000);//5000 means 5 seconds.

或者如果您想稍后执行任务,那么您可以执行以下操作。

var obj = SomeFunctionAsync().AsTask(); // this will return u a IAsyncOperation object.
//some lines of code.
var result = await obj; //and this line will actually execute the method asyncronosly and return u the required value (if any).

然后您需要将模拟设置为 return 预期结果,以便可以按预期执行测试。

var response = new EMCResponse {
    //populate
};

wcfMock
    .Setup(x => x.EMCreateAsync(It.IsAny<EMCreateRequest>()))
    .ReturnAsync(response);

就是说,如果可以将该代码重构为一直异步并且不必进行阻塞调用。

public class PEProcessor : IPEProcessor {
    public PEProcessor(IService service) {
        _proxy = service;
        _emUpdate = new EMUpdate(service);
    }    

    public async Task CreateAddress(string modelName, string version, string name, MType mType, Address address, EMRequest request) {
        var response = await _proxy.EMCreateAsync(request); // should return object of type (awaitable) System.Threading.Tasks.Task<EMCResponse>
        address.Id = Convert.ToInt32(response.CM[0].Code);
    }
}

可以按如下方式进行练习

[Fact]
public async Task RequestIsVerifiable() {

    //Arrange
    var wcfMock = new Mock<IService>();

    var response = new EMCResponse {
        //populate
    };

    wcfMock
        .Setup(x => x.EMCreateAsync(It.IsAny<EMCreateRequest>()))
        .ReturnAsync(response);

    var peProcessor = new PEProcessor(wcfMock.Object);

    //Act        
    await peProcessor.CreateAddress(MoqData.ModelName, MoqData.version, MoqData.name,
        MoqData.MType, MoqData.AddressesList(), MoqData.EMRequest);

    //Assert
    wcfMock.Verify(service => service.EMCreateAsync(It.IsAny<EMCreateRequest>()), Times.AtLeastOnce);
}