Основная проблема здесь в том, что SQLiteDataReader
имеет конструктор internal
, что затруднит попытки его подделать. Это оставляет попытку выполнить интеграционный тест с фактическим соединением, командой и считывателем, который не очень изолирован.
Если, однако, метод расширения был изменен, чтобы зависеть от абстракции, такой как DbDataReader
public static DateTime GetDateTime(this DbDataReader reader, int columnNumber, string format) {
string date = reader.GetString(columnNumber);
DateTime dateTime = DateTime.ParseExact(date, format, null);
return dateTime;
}
Это позволило бы более легко протестировать метод расширения с помощью имитатора
[TestMethod]
public void Should_GetDateTime_Given_Format() {
//Arrange - using Moq
string expected = "2020-02-22";
string format = "yyyy-MM-dd";
int columnNumber = 0;
var target = Mock.Of<DbDataReader>(_ => _.GetString(columnNumber) == expected);
//Act
var actual = target.GetDateTime(columnNumber, format);
//Assert - using FluentAssertions
actual.ToString(format).Should().Be(expected);
}
А также означает, что метод расширения можно использовать повторно для других производных DbDataReader
, а не только SQLiteDataReader