【问题标题】:How can I solve the issue about using Moq with IDataReader如何解决将 Moq 与 IDataReader 一起使用的问题
【发布时间】:2012-04-27 11:34:25
【问题描述】:

我遇到了关于 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,但它的所有属性都是空的。如果我从像 reader["name"] 这样的模拟读者那里检查值,我得到了“Alingsås”值,所以模拟是正确的,但 Automapper 接缝有问题。 我使用传递给我的方法的对象列表来模拟它。

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

代码工作正常,没有抛出异常,但是映射器给了我一个没有 值。我可以在调试器中看到我的反射代码有效,但它看起来像我的 x["Name"] 不是从 IDataReader 调用的 Automapper 方法吗?还是这样?

这里有什么问题?

【问题讨论】:

  • 你能发布你的MockTester.MockIDataReader方法的完整代码吗?
  • 已添加完整代码。前段时间从这里的另一个帖子中得到了一些。 x[name] 的值在我调试时设置...
  • 很好 :) 这几乎就像我为重现您的问题而创建的 MockIDataReader。基本上你需要设置一个不同的索引器,我会在一分钟内发布我的答案。

标签: c# moq automapper


【解决方案1】:

Automapper 在内部使用 IDataReaderint indexer,因此您需要调用 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);
//...

【讨论】:

  • Nice ;) ty nemesv 它解决了我的问题。我以为是这种情况,但不确定,也从来没有让我的测试对 int 正确。我用你的替换了我的 foreach,我的测试变成了绿色:D +++++++1
  • 谢谢,这对我的测试很有帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-21
  • 1970-01-01
  • 2017-05-14
  • 1970-01-01
  • 2019-02-19
  • 1970-01-01
相关资源
最近更新 更多