Как смоделировать базу данных для SQLiteDataReader.GetString? - PullRequest
1 голос
/ 22 февраля 2020

У меня есть метод расширения для SQLiteDataReader, который преобразует данные, полученные из метода GetString.

public static DateTime GetDateTime(this SQLiteDataReader reader, int columnNumber, string format)
{
    string date = reader.GetString(columnNumber);
    DateTime dateTime = DateTime.ParseExact(date, format, null);

    return dateTime;
}

Для того, чтобы выполнить его модульное тестирование, я предполагаю, что мне нужно смоделировать базу данных или каким-то образом замените метод GetString.

Должен ли я использовать пример базы данных для своих модульных тестов, смоделировать или смоделировать GetString в целом?

1 Ответ

1 голос
/ 22 февраля 2020

Основная проблема здесь в том, что 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...