你的模拟是在正确的轨道上,但是dataReaderMock.Setup(x => x.Read()).Returns(() => records);
你出错的地方是.Read
返回一个布尔值,而不是记录本身,它们是由你的方法读出的IDataReader
。
安排模拟:
var dataReader = new Mock<IDataReader>();
dataReader.Setup(m => m.FieldCount).Returns(2); // the number of columns in the faked data
dataReader.Setup(m => m.GetName(0)).Returns("First"); // the first column name
dataReader.Setup(m => m.GetName(1)).Returns("Second"); // the second column name
dataReader.Setup(m => m.GetFieldType(0)).Returns(typeof(string)); // the data type of the first column
dataReader.Setup(m => m.GetFieldType(1)).Returns(typeof(string)); // the data type of the second column
您可以排列列来品尝以模拟更多真实的数据,类型等。在您的系统中,只需确保第一个计数,GetName
s 的数量和 s 的数量GetFieldType
是同步的。
要安排.Read()
,我们可以使用 SetupSequence:
dataReader.SetupSequence(m => m.Read())
.Returns(true) // Read the first row
.Returns(true) // Read the second row
.Returns(false); // Done reading
要在测试中使用它,您可以将其提取到方法中:
private const string Column1 = "First";
private const string Column2 = "Second";
private const string ExpectedValue1 = "Value1";
private const string ExpectedValue2 = "Value1";
private static Mock<IDataReader> CreateDataReader()
{
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);
return dataReader;
}
(或者,您可以将其安排在 a 上Setup
,如果这对您的测试类更有意义 - 在这种情况下,dataReader
模拟将是一个字段,而不是返回值)
示例测试。然后它可以像这样使用:
[Test]
public void ResovleDataReader_RowCount()
{
var dataReader = CreateDateReader();
var view = ResolveDataReader(dataReader.Object);
Assert.AreEqual(2, view.Count);
}
[Test]
public void ResolveDataReader_NamesColumn1()
{
var dataReader = CreateDataReader();
var view = ResolveDataReader(dataReader.Object);
Assert.AreEqual(Column1, view.Table.Columns[0].ColumnName);
}
[Test]
public void ResolveDataReader_PopulatesColumn1()
{
var dataReader = CreateDataReader();
var view = ResolveDataReader(dataReader.Object);
Assert.AreEqual(ExpectedValue1, view.Table.Rows[0][0]);
}
// Etc..
(我使用过 NUnit,但对于不同的测试框架,它只是测试方法上的不同属性和不同的断言语法相似)
顺便说一句,我通过更改ResolveDataReader
tointernal
和设置来完成上述工作InternalsVisibleTo
,但是我假设您已经拥有进入此私有方法的网关,因为您已经尝试对其进行测试。