2016-12-08 16 views
2

私はMoqでテストするのが初めてです。だから、ReturnsAsyncに関する少し混乱しています。 ここに私のテストメソッドがあります。ReturnsAsyncは、Setupで定義されたメソッドによって返される型を受け取るはずです。私は正しい?Moq WebApi非同期メソッド

しかし、ReturnsAsyncはもう1つの署名が必要です - 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

インテリセンスは何と言っていますか? –

+0

@KennethK(私はあなたが、VSで作業していると仮定)。、それはタスクが>はい、方法はandrey.shedko @ –

答えて

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>のPARAMTERとして戻り値を取るべきです。たとえば、コードの次の2行は(行動によって)等しい:

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

を型に代入ではないことを言いますOKをクリックし、このメソッドの期待値をReturnAsyncのパラメータとして渡すか、上記のコードのようにTask.ResultでReturnを使用します。 –

+0

>をタスクを返すGETALLのFunc > –

関連する問題