C# Lambda查询无法处理'Task<;的最低起订量数据;IEnumerable<;动态>>;`返回类型方法
通过Moq设置提供虚拟数据时,此查询不起作用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
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()));