Вы были на правильном пути с вашими издевательствами, но dataReaderMock.Setup(x => x.Read()).Returns(() => records);
- это то, где вы поступили не так, как .Read
возвращает bool, а не сами записи, которые считывают 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 и число GetFieldType
s синхронизированы.
Для организации .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;
}
(В качестве альтернативы, можно организовать это на 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
к internal
и установка InternalsVisibleTo
, но я предполагаю, что у вас есть шлюз в этот частный метод, как вы получили, насколько вы сделали с попыткой проверить Это.
Какая у вас проблема? –
Я не могу заполнить насмешливый объект фиктивными данными. Это не позволяет мне проверять логику в моем методе. – Hristo
Как применяется метод ResolveDataReader? Мне нужно, чтобы код мог привести пример ... –