Lambda查询不能使用“任务<ienumerable <dynamic>&gt;”返回类型方法的Moq数据

时间:2017-12-19 14:28:39

标签: c# unit-testing dynamic mocking moq

通过Moq设置提供虚拟数据时,此查询无效。

[17-12-19 16:27:21:523 SAST] 0.0
[17-12-19 16:27:21:523 SAST] 0.0
[17-12-19 16:27:21:524 SAST] 0.0
[17-12-19 16:27:21:525 SAST] 0.0
[17-12-19 16:27:21:526 SAST] 0.0
[17-12-19 16:27:21:527 SAST] 0.0
[17-12-19 16:27:21:527 SAST] 0.0
[17-12-19 16:27:21:528 SAST] 0.0
[17-12-19 16:27:21:529 SAST] 0.0
[17-12-19 16:27:21:529 SAST] 0.0
[17-12-19 16:27:21:530 SAST] 0.0
[17-12-19 16:27:21:531 SAST] 0.0
[17-12-19 16:27:21:532 SAST] 0.0
[17-12-19 16:27:21:533 SAST] 0.0
[17-12-19 16:27:21:533 SAST] 0.0
[17-12-19 16:27:21:534 SAST] 0.0
[17-12-19 16:27:21:535 SAST] 0.0
[17-12-19 16:27:21:535 SAST] 0.0
[17-12-19 16:27:21:536 SAST] 0.0
[17-12-19 16:27:21:536 SAST] 0.0
[17-12-19 16:27:21:537 SAST] 0.0

使用Moq传递数据:

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

其中 mockColorsRepository.Setup(rep => rep.GetColorsList()).Returns(Task.FromResult<IEnumerable<dynamic>> (new[] { new { DoorCode = "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode = "2" } })); 具有异步方法和动态返回类型

GetColorsList()

enter image description here

通过硬编码传递数据:

但它正在工作,而我正在硬编码相同的数据方式而不使用Moq,如

Task<IEnumerable<dynamic>> GetColorsList();

enter image description here

问题是:您可以在调试时以两种方式查看数据,但Lambda查询在通过Moq Setup传递Mock数据时不起作用。

  

注意不工作意味着投放 var colorsList = Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode = "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode = "2" } }).Result; 不包含Object 错误的定义。

enter image description here

2 个答案:

答案 0 :(得分:2)

您的模拟返回IEnumerable<f__AnonymousType0<string,string>>,它由编译器生成为 internal 类,因此您无权访问测试库中的属性。

理想情况下,您可以重写,以便将dynamic的使用替换为您定义并控制的类(并因此可以适当地访问)。

另一个选择是使用反射来从对象中获取值cl.GetType().GetProperty("MainTypeCode").GetValue(cl)的内容,在我看来,这是一个hacky解决方案,但它仍然是一个选项。

答案 1 :(得分:1)

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

  

我认为默认情况下匿名类型是内部的,因此您无法访问其他库中的属性,即您的测试项目

我从讨论中得到了它:Return/consume dynamic anonymous type across assembly boundaries

所以我去使用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())); 

现在一切正常。