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" } })));

错误:

它显示以下错误

enter image description here

注意:对于其他一些完美运行的测试方法,我使用相同的代码。但是这个问题只发生在我使用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`设置来获取动态类型的数据的主要内容,如果未能解决你的问题,请参考以下文章

Java新特性之函数式接口

Java8_函数式接口

我的查询根本不起作用并抛出错误

Linq Lambda 错误:指定的 LINQ 表达式包含对与不同上下文关联的查询的引用

Lambda 因“找不到模块...”而失败

Lambda如何使用?