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



我是 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);
}

提前感谢!!

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

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

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

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

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

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

相关内容

最新更新