2016-02-04 1 views
4

Я новичок в Moq, и я изо всех сил пытаюсь написать Unit Test для тестирования метода, который преобразует SqlDataAdapter в System.DataView. Это мой метод:Как издеваться над IDataReader для тестирования метода, который преобразует SqlDataReader в System.DataView

private DataView ResolveDataReader(IDataReader dataReader) 
{ 
    DataTable table = new DataTable(); 

    for (int count = 0; count < dataReader.FieldCount; count++) 
    { 
     DataColumn col = new DataColumn(dataReader.GetName(count), 
             dataReader.GetFieldType(count)); 
     table.Columns.Add(col); 
    } 

    while (dataReader.Read()) 
    { 
     DataRow dr = table.NewRow(); 
     for (int i = 0; i < dataReader.FieldCount; i++) 
     { 
      dr[i] = dataReader.GetValue(dataReader.GetOrdinal(dataReader.GetName(i))); 
     } 
     table.Rows.Add(dr); 
    } 

    return table.DefaultView; 
} 

Я пытаюсь создать, чтобы создать что-то вроде:

var dataReaderMock = new Mock<IDataReader>(); 
var records = new Mock<IDataRecord>(); 
dataReaderMock.Setup(x => x.FieldCount).Returns(2); 
dataReaderMock.Setup(x => x.Read()).Returns(() => records); 

Я хотел бы передать некоторые данные и убедитесь, что он преобразуется.

Спасибо.

+1

Какая у вас проблема? –

+0

Я не могу заполнить насмешливый объект фиктивными данными. Это не позволяет мне проверять логику в моем методе. – Hristo

+0

Как применяется метод ResolveDataReader? Мне нужно, чтобы код мог привести пример ... –

ответ

6

Вы были на правильном пути с вашими издевательствами, но 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, но я предполагаю, что у вас есть шлюз в этот частный метод, как вы получили, насколько вы сделали с попыткой проверить Это.

 Смежные вопросы

  • Нет связанных вопросов^_^