Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何为SQLiteDataReader.GetString模拟数据库?_C#_Database_Sqlite_Unit Testing_Mocking - Fatal编程技术网

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;
}