通过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()
通过硬编码传递数据:
但它正在工作,而我正在硬编码相同的数据方式而不使用Moq,如
Task<IEnumerable<dynamic>> GetColorsList();
问题是:您可以在调试时以两种方式查看数据,但Lambda查询在通过Moq Setup传递Mock数据时不起作用。
注意不工作意味着投放
var colorsList = Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode = "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode = "2" } }).Result;
不包含Object
错误的定义。
答案 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()));
现在一切正常。