繁体   English   中英

Lambda查询不能与`任务的Moq数据一起使用 <IEnumerable<dynamic> &gt;`返回类型方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM