如何为SQLiteDataReader模拟数据库.GetString



我有一个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

这里的主要问题是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

最新更新