【问题标题】:Pass Mock datareader to datatable load method将 Mock datareader 传递给数据表加载方法
【发布时间】:2018-02-07 09:11:12
【问题描述】:

我正在尝试对一段具有以下行之一的代码进行单元测试

var datatable = new DataTable();
datatable.Load(datareader);

所以我想在 load 方法中传递模拟的数据读取器对象。我希望数据表类从数据读取器加载我的存根值。

我在测试用例中完成了以下设置

var dataReader = new Mock<IDataReader>();

    dataReader.Setup(m => m.FieldCount).Returns(2);
    dataReader.Setup(m => m.GetName(0)).Returns(Column1);
    dataReader.Setup(m => m.GetName(1)).Returns(Column2);

    dataReader.Setup(m => m.GetFieldType(0)).Returns(typeof(string));
    dataReader.Setup(m => m.GetFieldType(1)).Returns(typeof(string));

    dataReader.Setup(m => m.GetOrdinal("First")).Returns(0);
    dataReader.Setup(m => m.GetValue(0)).Returns(ExpectedValue1);
    dataReader.Setup(m => m.GetValue(1)).Returns(ExpectedValue2);

    dataReader.SetupSequence(m => m.Read())
        .Returns(true)
        .Returns(true)
        .Returns(false);

我可以在调试时看到我的数据阅读器已成功模拟。但是当DataTable.Load 被执行时。 DataTable 对象没有任何值。我可以看到列名已加载,但在行中看不到任何值。即使行号是正确的,但在任何行中都没有值。

我的猜测是 DataTable.Load 不使用 GetValue 从数据读取器中获取数据,我的测试用例是为数据读取器的 GetValue 方法设置的。我也尝试设置GetString 方法,但仍然无法正常工作。知道我应该设置哪种数据读取器方法以便数据表能够正确加载值吗?

【问题讨论】:

标签: c# unit-testing datatable moq


【解决方案1】:

我参加聚会有点晚了,但我发现以下内容对我有用(行也被填充)

var dataReader = new Mock<DbDataReader>();
dataReader.Setup(c => c.FieldCount).Returns(2);

dataReader.Setup(c => c.GetFieldType(0)).Returns(typeof(string));
dataReader.Setup(c => c.GetFieldType(1)).Returns(typeof(string));

// Columns
dataReader.Setup(c => c.GetName(0)).Returns("Column1");
dataReader.Setup(c => c.GetName(1)).Returns("Column2");

dataReader.Setup(m => m.GetOrdinal("Column1")).Returns(0);

// Rows
// NOTE: Unfortunately this only works for a single row.
dataReader.Setup(c => c.GetValues(It.IsAny<object[]>())).Callback<object[]>(
    (values) =>
        {
            values[0] = "Column1 Value";
            values[1] = "Column2 Value";
        }
).Returns(2);

// Read one row
dataReader.SetupSequence(c => c.Read()).Returns(true).Returns(false);

不是一个优雅的解决方案,而是一个非常快速的解决方法,我用作临时解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多