C# 如何为SQLiteDataReader.GetString模拟数据库?
我有一个用于C# 如何为SQLiteDataReader.GetString模拟数据库?,c#,database,sqlite,unit-testing,mocking,C#,Database,Sqlite,Unit Testing,Mocking,我有一个用于SQLiteDataReader的扩展方法,用于强制转换从GetString方法获得的数据 public static DateTime GetDateTime(this SQLiteDataReader reader, int columnNumber, string format) { string date = reader.GetString(columnNumber); DateTime dateTime = DateTime.ParseExact(date
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
方法
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
?这里的主要问题是SQLiteDataReader
有一个内部
构造函数,这使得模拟它相当困难。这样就可以尝试使用实际的连接、命令和读取器执行集成测试,这并不是非常孤立的
然而,如果扩展方法被重构为依赖于抽象,比如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);
}
[TestMethod]
public void应该\u GetDateTime\u给定\u格式(){
//安排-使用最小起订量
字符串应为=“2020-02-22”;
字符串格式=“yyyy-MM-dd”;
int columnNumber=0;
var target=Mock.Of(=>u.GetString(columnNumber)=预期值);
//表演
var actual=target.GetDateTime(columnNumber,格式);
//断言-使用FluentAssertions
实际.ToString(格式).Should().Be(预期值);
}
这还意味着扩展方法可以在其他派生的
DbDataReader
上重用,而不仅仅是SQLiteDataReader
如果有人在没有GetString
方法的DbDataReader
上使用它会怎么样?@J.Doe继承的问题是它必须有GetString
。如果基类没有被重写,那么它会按照设计抛出一个异常。
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;
}