Метод заливки IDbDataAdapter с помощью Moq - PullRequest
1 голос
/ 16 августа 2011

У меня есть объект, который читает данные из файла Excel, используя, который принимает IDbConnection, IDbDataAdapter и IDbCommand.Я использую метод заливки адаптеров, чтобы заполнить таблицу данными, и вот как я сейчас ее высмеиваю:

[TestCase]
public void TestReadCellsFromSpreadsheetReadsSuccessfully()
{
    var cells = new List<ReportData>
                    {
                        new ReportData { CellId = 1, ExcelCellLocation = "A1"},
                        new ReportData { CellId = 2, ExcelCellLocation = "A2"},
                        new ReportData { CellId = 3, ExcelCellLocation = "A3"},
                        new ReportData { CellId = 4, ExcelCellLocation = "A4"}
                    };

    _mockAdapter.Setup(a => a.Fill(It.IsAny<DataSet>()))
        .Callback((DataSet ds) =>
                      {
                          if (ds.Tables["Table"] == null)
                          {
                              ds.Tables.Add("Table");
                              ds.Tables["Table"].Columns.Add(new DataColumn());
                          }

                          var row = ds.Tables["Table"].NewRow();
                          row[0] = "Test";

                          ds.Tables["Table"].Rows.Add(row);
                      });

    var excelReader = new ExcelReader(_mockConnection.Object, _mockAdapter.Object, _mockCommand.Object);
    excelReader.ReadCellsFromSpreadsheet("Deal Summary", cells);

    _mockCommand.VerifySet(c => c.CommandText = It.IsAny<string>(), Times.Exactly(cells.Count));
    _mockAdapter.VerifySet(a => a.SelectCommand = _mockCommand.Object, Times.Exactly(cells.Count));
    _mockAdapter.Verify(a => a.Fill(It.IsAny<DataSet>()), Times.Exactly(cells.Count));
}

Эта реализация работает, но я чувствую, что слишком много делаю, чтобы смоделировать адаптер... есть ли лучший способ сделать это?

Ответы [ 2 ]

0 голосов
/ 16 августа 2011

Не передавайте эти 3 объекта в качестве параметров. Вместо этого передайте IDataReader, IDataProvider или что-то подобное, что возвращает данные. Тогда вы просто издеваетесь над этим объектом. И вам не нужна ссылка на System.Data в проекте, содержащем ExcellReader.

И еще две вещи, которые мне не нравятся в вашем коде. Почему TestCase вместо Test?

Вы уверены, что хотите создать команду и заполнить набор данных для каждого столбца отдельно? (но, возможно, я не понимаю ваш код)

0 голосов
/ 16 августа 2011

В общем, у меня есть несколько правил доступа к данным:

  1. Напишите простой класс, который оборачивает всю логику доступа к данным, чтобы другим классам не приходилось иметь дело с DataAdapters и всем этим дерьмом.
  2. Когда вы пишете модульные тесты, не копируйте DataAdapters; вместо этого просто смоделируйте классы-оболочки, которые вы только что создали.
  3. Сделайте логику оболочки доступа к данным настолько простой, чтобы ее не нужно было тестировать модулем. Если это НЕОБХОДИМО проверить, то напишите интеграционные тесты, которые попали в небольшую базу данных.
...