我是 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).