【发布时间】: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 方法,但仍然无法正常工作。知道我应该设置哪种数据读取器方法以便数据表能够正确加载值吗?
【问题讨论】:
-
这里是
DataTable.Load的来源。 -
FastMember会满足您的需求吗? stackoverflow.com/a/29902012/34092 -
@mjwills 这看起来超级方便。我将把它添加到我的工具箱中。
标签: c# unit-testing datatable moq