2017-12-19 31 views
1

のMoqデータではLambdaクエリが動作しませんMoq Setupを介してダミーデータを渡している間、このクエリは機能しません。`Task <IEnumerable <dynamic>>戻り値の型メソッド

colorsList.Select(cl => (string)cl.MainTypeCode).Where(mt => mt != null).Distinct().ToList() 

部品番号を使用してデータを渡す:

を: GetColorsList()がハードコーディングによって非同期方式とダイナミック戻り型

Task<IEnumerable<dynamic>> GetColorsList(); 

enter image description here

渡すデータを有する

mockColorsRepository.Setup(rep => rep.GetColorsList()).Returns(Task.FromResult<IEnumerable<dynamic>> 
       (new[] { new { DoorCode = "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode = "2" } })); 

しかし、私は部品番号を使用せずにデータのと同じ方法をハードコーディングしていながら、それは、働いている

var colorsList = Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode = "001", MainTypeCode = "1" }, 
        new { DoorCode = "002", MainTypeCode = "2" } }).Result; 

enter image description here

のような問題がです:あなたは、デバッグの間、両方の方法でデータを見ることができます、しかし、 Moq Setupを介してMockデータを渡している間は、Lambdaクエリが機能しません。

は、それがObjectを投げするmaintypecodeエラーの定義が含まれていない作業を意味しません。

enter image description here

+0

なぜここでは「ダイナミック」を使用していますか? –

+0

このようなものを使用しようとするとどうなりますか? 'carlist.Select(cl =>(string)(.MainTypeCode).MainTypeCode).Where(...'また、クラス全体を分割して、ダイナミックを残しておきたい場合は、 –

+0

@CamiloTerevintoは試してみようとするでしょう –

答えて

1

ありがとう@DaveParsonsが私に重要なアイデアをくれました。

私はこの議論からそれを得た

すなわちテストプロジェクト、匿名型は、あなたが別のライブラリからのプロパティにアクセスすることができませんので、デフォルトでは内部だと思います:Return/consume dynamic anonymous type across assembly boundaries

だから、私は再にそのモックデータを渡していたデータに

public static IEnumerable<dynamic> GetValues() 
     { 
      List<ExpandoObject> expando = new List<ExpandoObject>(); 

      dynamic expandoObject = new ExpandoObject(); 
      expandoObject.DoorCode = "123"; 
      expandoObject.MainTypeCode = "123"; 
      expando.Add(expandoObject); 

      dynamic expandoObject1 = new ExpandoObject(); 
      expandoObject1.DoorCode = "321"; 
      expandoObject1.MainTypeCode = "321"; 
      expando.Add(expandoObject1); 

      return expando; 
     } 

をあざけるためExpandoObjectを使用して行くのですすべてが今取り組んでいるMoq setup

mockColorsRepository.Setup(rep => rep.GetColorsList()).Returns(Task.FromResult(GetValues())); 

のような方法を回します。

2

あなたのモックは、internalクラスとして、コンパイラによって生成されるので、あなたのテストライブラリからプロパティへのアクセスを持っていないIEnumerable<f__AnonymousType0<string,string>>を返しています。

dynamicの代わりに、あなたが定義して管理している(したがって適切にアクセスできる)クラスに置き換えるのが理想的です。

もう一つの選択肢は、cl.GetType().GetProperty("MainTypeCode").GetValue(cl)の行に沿ってオブジェクトから値を取得するためにリフレクションを使用することです。これは、私の意見では、ちょっとしたハックの解決策ですが、それでもオプションです。

関連する問題