C# moqwebapi异步方法
我刚开始使用Moq进行测试,所以我对C# moqwebapi异步方法,c#,unit-testing,asp.net-web-api,moq,C#,Unit Testing,Asp.net Web Api,Moq,我刚开始使用Moq进行测试,所以我对ReturnsAsync有点困惑。 这是我的测试方法,我希望ReturnsAsync应该接收将由Setup中定义的方法返回的类型。我说得对吗 但是似乎ReturnsAsync应该有另一个签名-它正在寻找Func委托 [TestClass] public class TourObjectControllerTest { [TestMethod] public async Task GetTourObjects() { va
ReturnsAsync
有点困惑。
这是我的测试方法,我希望ReturnsAsync
应该接收将由Setup
中定义的方法返回的类型。我说得对吗
但是似乎ReturnsAsync
应该有另一个签名-它正在寻找Func
委托
[TestClass]
public class TourObjectControllerTest
{
[TestMethod]
public async Task GetTourObjects()
{
var mockService = new Mock<ITourObjectService>(MockBehavior.Default);
mockService.Setup(x => x.GetAll()).ReturnsAsync(new Task<IEnumerable<TourObjectDTO>>);
var controller = new TourObjectController(mockService.Object);
var result = await controller.Get();
Assert.IsNotNull(result);
Assert.AreSame(typeof(TourObjectViewModel), result);
}
}
[TestClass]
公共类TourObjectControllerTest
{
[测试方法]
公共异步任务GetTourObjects()
{
var mockService=new Mock(MockBehavior.Default);
mockService.Setup(x=>x.GetAll()).ReturnsAsync(新任务);
var控制器=新的TourObjectController(mockService.Object);
var result=await controller.Get();
Assert.IsNotNull(结果);
arame(typeof(TourObjectViewModel),result);
}
}
试验方法:
public async Task<IEnumerable<TourObjectViewModel>> Get()
{
IEnumerable<TourObjectViewModel> viewmodel = null;
try
{
var tourobjects = await _tos.GetAll();
viewmodel = Mapper.Map<IEnumerable<TourObjectViewModel>>(tourobjects);
}
catch (Exception ex)
{
Log.ErrorFormat("Method:{0} <br/> Error: {1}", System.Reflection.MethodBase.GetCurrentMethod().Name, ex);
}
return viewmodel;
}
公共异步任务Get()
{
IEnumerable viewmodel=null;
尝试
{
var tourobjects=wait_tos.GetAll();
viewmodel=Mapper.Map(tourobjects);
}
捕获(例外情况除外)
{
ErrorFormat(“方法:{0}错误:{1}”,System.Reflection.MethodBase.GetCurrentMethod().Name,ex); } 返回视图模型; }
ReturnsAsync()
应将返回值作为参数,而不是Task
。例如,接下来的两行代码相等(按行为):
如果需要,也可以创建假数据生成器
请注意,ReturnsAsync()
仅适用于返回任务的方法。对于只返回任务的方法,可以使用.Returns(Task.FromResult(default(object))
。传递实际结果
假设ITourObjectService.GetAll()
返回Task
乙二醇
[TestClass]
公共类TourObjectControllerTest
{
[测试方法]
公共异步任务GetTourObjects()
{
var fakeData=新列表(){
新TourObjectDTO{…}
};
var mockService=new Mock(MockBehavior.Default);
mockService.Setup(x=>x.GetAll()).ReturnsAsync(fakeData);
var控制器=新的TourObjectController(mockService.Object);
var result=await controller.Get();
Assert.IsNotNull(结果);
IsTry(typeof(IEnumerable).IsAssignableFrom(result.GetType());
}
}
Intellisense怎么说?(我假设您在VS中工作)@KennethK.,它说任务不能分配给FuncYes类型,方法GetAll returnTask@andrey.shedko好的,然后只需将此方法的预期值作为ReturnsAsync的参数传递,或者将Returns与Task一起使用。结果如上述代码所示。如果我错了,请更正我,Moq生成IEnumerable类型的随机数据?不,它不会。没有som时不会e extension或pluginWell,那么这是如何模拟存储库/服务行为的呢?您正在模拟服务,并提供一些虚假数据,以便在调用模拟成员时返回。测试失败,甚至出现实际结果-Assert.IsNotNull()中出错
mockService.Setup(x => x.GetAll()).ReturnsAsync(new List<TourObjectDTO>());
mockService.Setup(x => x.GetAll()).Returns(Task.FromResult(new List<TourObjectDTO>()));
var testData = new [] { new TourObjectDTO(1, "test1"), new TourObjectDTO(2, "test2") };
mockService.Setup(x => x.GetAll()).ReturnsAsync(testData);
[TestClass]
public class TourObjectControllerTest
{
[TestMethod]
public async Task GetTourObjects()
{
var fakeData = new List<TourObjectDTO>() {
new TourObjectDTO { ... }
};
var mockService = new Mock<ITourObjectService>(MockBehavior.Default);
mockService.Setup(x => x.GetAll()).ReturnsAsync(fakeData);
var controller = new TourObjectController(mockService.Object);
var result = await controller.Get();
Assert.IsNotNull(result);
Assert.IsTry(typeof(IEnumerable<TourObjectViewModel>).IsAssignableFrom(result.GetType());
}
}