加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 如何解决使用Moq和IDataReader的问题

发布时间:2020-12-15 17:25:46 所属栏目:百科 来源:网络整理
导读:关于IDataReader我遇到了Moq和Automapper的问题. 我在stackoverflow上找到了一个例子并修改了代码. public static IDataReader MockIDataReaderT(ListT ojectsToEmulate) where T : class { var moq = new MockIDataReader(); // This var stores current po
关于IDataReader我遇到了Moq和Automapper的问题.
我在stackoverflow上找到了一个例子并修改了代码.

public static IDataReader MockIDataReader<T>(List<T> ojectsToEmulate) where T : class
    {
        var moq = new Mock<IDataReader>();

        // This var stores current position in 'ojectsToEmulate' list
        var count = 0;

        moq.Setup(x => x.Read())
            // Return 'True' while list still has an item
            .Returns(() => count < ojectsToEmulate.Count)
            // Go to next position
            .Callback(() => count++);

        var properties = typeof (T).GetProperties();
        foreach (PropertyInfo t in properties)
        {
            var propName = t.Name;
            moq.Setup(x => x[propName]).Returns(() => ojectsToEmulate[count].GetType().GetProperty(propName).GetValue(ojectsToEmulate[count],null));
        }
        return moq.Object;
    }
}

我的映射:

Mapper.Configuration.CreateMap(typeof(IDataReader),typeof(IEnumerable<T>));
var result = Mapper.Map<IDataReader,IEnumerable<T>>(reader);

我在这里遇到的问题是我的结果有1个结果是cityModel但它的所有属性都是null.如果我检查我的模拟读者的值,如读者[“名称”],我得到了“Alings?s”值,因此模拟是正确的,但Automapper接缝有问题.
我使用了一个对象List,我传递给我的方法,模仿它.

var cityModel = new CityModel();
cityModel.Name = "Alings?s";
cityModel.Id = "SE";
cityModel.CountryId = "SE";

var cityModels = new List<CityModel>();
cityModels.Add(cityModel);

 _fakeReader = MockTester.MockIDataReader(cityModels);

代码工作正常,没有抛出异常,但映射器给了我一个没有的对象
valules.我可以在调试器中看到我的反射代码可以工作,但它像我一样接缝
x [“Name”]不是从IDataReader调用Automapper的方法吗?或者是吗?

这可能有什么不对?

解决方法

Automapper在内部使用 int indexer的IDataReader,因此您需要在其上调用Setup而不是Item [String].

检查Automapper的源代码,您需要设置一些其他方法才能使其工作:

//...
var index = 0;
foreach (PropertyInfo t in properties)
{
    var propName = t.Name;
    int index1 = index; // avoid access to modified closure
    moq.Setup(x => x.GetFieldType(index1)).Returns(t.PropertyType);
    moq.Setup(x => x.GetName(index1)).Returns(propName);
    moq.Setup(x => x[index1])
        .Returns(ojectsToEmulate[count]
                 .GetType()
                 .GetProperty(propName).GetValue(ojectsToEmulate[count],null));
    index++;
}

moq.Setup(x => x.FieldCount).Returns(properties.Length);
//...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读