2016-12-08 40 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的返回值。 –