Lambda查询抛出对象不包含错误,同时通过`MOQ`设置来获取动态类型的数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda查询抛出对象不包含错误,同时通过`MOQ`设置来获取动态类型的数据相关的知识,希望对你有一定的参考价值。
Lambda查询抛出对象不包含错误,同时通过MOQ
设置来获取动态类型的数据
测试方法:
[Fact]
public void GetMainTypeList()
{
var mockColorsRepository = MoqHelper.CreateInstanceOfIMock<IColorsRepository>();
mockColorsRepository.Setup(rep => rep.GetMainTypeList(It.IsAny<Colour>())).Returns((Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode = "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode = "2" } })));
ColorsValidator colorsValidator = new ColorsValidator(mockColorsRepository.Object);
CoCApiResponse response = colorsValidator.GetMainTypeList(mockColorsRepository.Object);
Assert.Equal(1, response.ResultCode);
}
业务类方法(类名为ColourValidator):
public CoCBaseCollection<string> GetMainTypeList()
{
CoCBaseCollection<string> mtlst = new CoCBaseCollection<string>();
var carlist = (IEnumerable<dynamic>)vehrep.GetMainTypeList().Result;
mtlst.AddItems(carlist.Select(cl => (string)cl.MainTypeCode).Where(mt => mt != null).Distinct().ToList());
return mtlst;
}
我为我的存储库调用做了MOQ设置,实时从数据库获取数据也设置了一个模拟数据,该数据通过Moq获取数据,同时对下面的行进行单元测试
存储库调用
var carlist = (IEnumerable<dynamic>)vehrep.GetMainTypeList().Result;// repository call
问题
mtlst.AddItems(carlist.Select(cl => (string)cl.MainTypeCode).Where(mt =>
mt != null).Distinct().ToList());// this code is not working while setup
mock data in return function of `Moq.Setup`
如果我手动给出carlist
数据,上面的代码是有效的,如下所示,
var carlist = Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode
= "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode
= "2" } }).Result;
但是,如果通过MOQ
设置响应给出相同的模拟数据,那个(存储库调用)代码不起作用,就像这样
mockColorsRepository.Setup(rep => rep.GetMainTypeList(It.IsAny<Colour>
())).Returns((Task.FromResult<IEnumerable<dynamic>>(new[] { new { DoorCode
= "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode
= "2" } })));
错误:
它显示以下错误
注意:对于其他一些完美运行的测试方法,我使用相同的代码。但是这个问题只发生在我使用
dynamic
类型而不是Business实体时。
答案
我现在无法在办公室看到图像链接,所以不知道错误/不正常的原因是什么。
我开始怀疑dynamic
的必要性。
但是通过查看您的业务类方法,我认为只需使用匿名类型就不需要转换为IEnumerable<dynamic>
。即以下应该仍然有效
var carlist = vehrep.GetMainTypeList().Result; // <-- remove the cast still work
mtlst.AddItems(carlist.Select(cl => (string)cl.MainTypeCode).Where(mt => mt != null).Distinct().ToList());
同时,我认为您不一定需要为(IEnumerable<dynamic>)
返回Task
,因为以下代码仍然有效
Task.FromResult(new[] { new { DoorCode
= "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode
= "2" }}).Result
这意味着对于你的moq设置,这应该工作
mockColorsRepository.Setup(rep => rep.GetMainTypeList(It.IsAny<Colour>
())).Returns((Task.FromResult(new[] { new { DoorCode // <-- Remove type
= "001", MainTypeCode = "1" }, new { DoorCode = "002", MainTypeCode
= "2" } })));
以上是关于Lambda查询抛出对象不包含错误,同时通过`MOQ`设置来获取动态类型的数据的主要内容,如果未能解决你的问题,请参考以下文章