[英]Lambda query is throwing object does not contains error while coming dynamic type of data via `MOQ` setup
[英]Lambda query does not working with Moq data for `Task<IEnumerable<dynamic>>` return type method
通过Moq Setup提供虚拟数据时,此查询无效。
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" } }));
其中GetColorsList()
具有异步方法和动态返回类型
Task<IEnumerable<dynamic>> GetColorsList();
通过硬编码传递数据:
但它正在工作,而我正在使用相同的数据方式而不使用Moq,就像
var colorsList = Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode = "001", MainTypeCode = "1" },
new { DoorCode = "002", MainTypeCode = "2" } }).Result;
问题是 :您可以在调试时以两种方式查看数据,但Lambda查询在通过Moq安装程序传递Mock数据时不起作用。
注意不起作用意味着它抛出一个
Object
不包含maintypecode
错误的定义 。
您的mock返回一个IEnumerable<f__AnonymousType0<string,string>>
,它由编译器作为internal
类生成,因此您无权访问测试库中的属性。
理想情况下,您可以重写,以便将您对dynamic
的使用替换为您定义并控制的类(并因此可以适当地访问)。
另一种选择是使用反射从对象中获取某些内容沿着cl.GetType().GetProperty("MainTypeCode").GetValue(cl)
的行cl.GetType().GetProperty("MainTypeCode").GetValue(cl)
在我看来,这是一个hacky解决方案,但是尽管如此,这是一个选择。
谢谢@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;
}
我将模拟数据传递给Moq setup
的返回方法
mockColorsRepository.Setup(rep => rep.GetColorsList()).Returns(Task.FromResult(GetValues()));
现在一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.