Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Lambda查询无法处理'Task<;的最低起订量数据;IEnumerable<;动态>>;`返回类型方法_C#_Unit Testing_Dynamic_Mocking_Moq - Fatal编程技术网

C# Lambda查询无法处理'Task<;的最低起订量数据;IEnumerable<;动态>>;`返回类型方法

C# Lambda查询无法处理'Task<;的最低起订量数据;IEnumerable<;动态>>;`返回类型方法,c#,unit-testing,dynamic,mocking,moq,C#,Unit Testing,Dynamic,Mocking,Moq,通过Moq设置提供虚拟数据时,此查询不起作用 colorsList.Select(cl => (string)cl.MainTypeCode).Where(mt => mt != null).Distinct().ToList() 通过使用Moq传递数据: mockColorsRepository.Setup(rep => rep.GetColorsList()).Returns(Task.FromResult<IEnumerable<dynamic>&g

通过Moq设置提供虚拟数据时,此查询不起作用

colorsList.Select(cl => (string)cl.MainTypeCode).Where(mt => mt != null).Distinct().ToList()
通过使用Moq传递数据:

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

通过硬编码传递数据:

但是,当我在不使用Moq的情况下硬编码相同的数据时,它就起作用了,比如

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

问题在于:调试时,您可以通过两种方式查看数据,但通过Moq设置传递模拟数据时,Lambda查询不起作用

colorsList.Select(cl => (string)cl.MainTypeCode).Where(mt => mt != null).Distinct().ToList()
注意不工作意味着它正在抛出一个
对象
不包含
maintypecode
错误的定义


您的模拟将返回一个
IEnumerable
,该类由编译器生成为
内部类,因此您无法从测试库访问属性

理想情况下,您应该能够重写,以便用您定义并控制(因此可以适当访问)的类替换对
动态
的使用


另一种选择是使用反射从对象获取值,类似于
cl.GetType().GetProperty(“MainTypeCode”).GetValue(cl)
这在我看来是一种有点老套的解决方案,但它仍然是一种选择。

谢谢@DaveParsons给了我一个关键的想法

我认为默认情况下匿名类型是内部的,因此您无法从另一个库(即您的测试项目)访问属性

我从这次讨论中得到:

因此,我将使用
ExpandoObject
模拟数据

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

现在一切正常

为什么您在这里使用
动态
?如果您尝试使用这样的东西会发生什么
carlist.Select(cl=>(string)((动态)cl.MainTypeCode)。其中(…
而且,如果我是,我会把整个类分开,把
动态
放在一边you@CamiloTerevinto将尝试让您知道突破性示例的
cl
类型以及它有哪些属性?您没有得到动态对象的列表,您得到的是
匿名类型的列表;我认为onymous类型默认为内部类型,因此您无法从另一个库(即您的测试项目)访问属性。
 mockColorsRepository.Setup(rep => rep.GetColorsList()).Returns(Task.FromResult(GetValues()));