2016-12-08 41 views
2

我是Moq测试的新手,所以我对ReturnsAsync感到困惑。 这里是我的测试方法,我期待ReturnsAsync应该接收的类型将通过Setup中定义的方法返回。我对吗?Moq WebApi异步方法

但似乎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); 
    } 
} 

方法:

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; 
} 
+0

什么是智能感知说呢? (我假设你在VS.工作) –

+0

@KennethK,它说的Task >是不能分配给类型Func键> –

回答

1

传递实际结果。

假设ITourObjectService.GetAll()回报Task<IEnumerable<TourObjectDTO>>

[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()); 
    } 
} 
+0

请纠正我,如果我错了,Moq生成IEnumerable 类型的随机数据? –

+1

不,它不。不是没有一些扩展或插件 – Nkosi

+0

那么,这是如何模拟库/服务行为? –

1

ReturnsAsync()应该采取一个返回值作为放慢参数,而不是Task<TReurnValue>。例如,接下来的两行代码是相等的(由行为):

mockService.Setup(x => x.GetAll()).ReturnsAsync(new List<TourObjectDTO>()); 
mockService.Setup(x => x.GetAll()).Returns(Task.FromResult(new List<TourObjectDTO>())); 

您需要更换new List<TourObjectDTO>()与你想从模拟测试,以检索您的测试数据。例如,您可以创建几个测试值:

var testData = new [] { new TourObjectDTO(1, "test1"), new TourObjectDTO(2, "test2") }; 
mockService.Setup(x => x.GetAll()).ReturnsAsync(testData); 

或者创建假数据生成器(如果需要)。

请注意ReturnsAsync()仅适用于返回Task<T>的方法。对于只返回Task的方法,可以使用.Returns(Task.FromResult(default(object)))

+0

是,方法GETALL返回任务> –

+0

@ andrey.shedko然后,只需将此方法的期望值作为ReturnsAsync的参数传递,或者像上面的代码中那样使用带有Task.Result的返回值。 –