C# 使用Moq为SqlDataReader编写单元测试用例

C# 使用Moq为SqlDataReader编写单元测试用例,c#,moq,C#,Moq,我有以下方法,希望编写单元测试用例,以便通过DataReader映射结果 public interface IIMGAdvancedSearchDBProvider { clsGPAdvancedSearchResult GetSearchResult(clsIMGAdvancedImageSearchCriteria searchCriteria); } public class clsIMGAdvancedSearchSQLDBProvider : IIMGAdvancedSear

我有以下方法,希望编写单元测试用例,以便通过DataReader映射结果

public interface IIMGAdvancedSearchDBProvider
{
    clsGPAdvancedSearchResult GetSearchResult(clsIMGAdvancedImageSearchCriteria searchCriteria);
}

public class clsIMGAdvancedSearchSQLDBProvider : IIMGAdvancedSearchDBProvider
{
    public clsGLGJSearchResultItem GetSearchResult(clsIMGAdvancedImageSearchCriteria searchCriteria)
    {   
        using (var sqlConnection = DfxDbConnection)
        {
            using (var sqlCommand = sqlConnection.CreateCommand())
            {
                sqlCommand.Parameters.Add("@userKey", SqlDbType.UniqueIdentifier).Value = State.WebUserKey;
                sqlCommand.Parameters.Add("@SiteCode", SqlDbType.VarChar).Value = State.SiteCode;
                sqlCommand.Parameters.Add("@MaxRows", SqlDbType.Int).Value = searchCriteria.MaxRows;

                //Add required client, client group filter paramters
                AddClientAndClientGroupFilterParameters(searchCriteria, sqlCommand);

                sqlCommand.CommandType = CommandType.Text;
                sqlCommand.CommandText = GetCompleteSQLStatement(searchCriteria);

                var reader = sqlCommand.ExecuteReader();

                return alTransaction(reader);

                reader.Close();
            }
        }
        return null;
    }

    private clsGLGJSearchResultItem GetJournalTransaction(SqlDataReader reader)
    {
        return new clsGLGJSearchResultItem
        {

            ClientKey = DfxUtilities.GetGuidValueFromReader(reader, "ClientKey") ?? Guid.Empty,
            JournalId = DfxUtilities.GetLongValueFromReader(reader, "JournalID") ?? 0,
            AccountingDate = (DateTime)reader["Date"],

            JournalSource =
                (enumJournalSources)
                Enum.Parse(typeof(enumJournalSources), reader["Source"].ToString()),

            Description = DfxUtilities.GetStringValueFromReader(reader, "Description"),
            DebitAmount = DfxUtilities.GetDecimalValueFromReader(reader, "DebitAmount") ?? 0,
            CreditAmount = DfxUtilities.GetDecimalValueFromReader(reader, "CreditAmount") ?? 0,
            ClientCode = DfxUtilities.GetStringValueFromReader(reader, "ClientCode"),
            ClientName = DfxUtilities.GetStringValueFromReader(reader, "ClientName"),

            Images = GetImageItems(reader)
        };
    }
}

有人能帮我解决这个问题吗?

我认为最好将数据抽象层(DAL)接口和类(如
IIMGAdvancedSearchDBProvider
clsIMGAdvancedSearchSQLDBProvider
)作为组件进行集成测试,而不是单元测试

换句话说,将数据库模式、触发器、种子测试数据和DAL实现类(包括调用
ExecuteReader
)的测试结合起来。DAL应该像您的DAL一样精简并排除业务逻辑。您通常会在数据库中为这些集成测试设置/拆卸测试数据。您可能还希望为这些DAL集成测试类创建一个公共基类,以设置测试数据库连接,也许还需要一些SQL日志记录。还可以使用边缘测试用例数据维护一个单独的测试数据库,或者以其他方式在设置/拆卸中注入此数据。这里没有嘲弄

然后,通过模拟DAL接口
IIMGAdvancedSearchDBProvider
在使用DAL接口的组件/类中返回的值,可以单元测试它上面的业务层类。我经常首先尝试完成DAL测试,并捕获一些“真实生产数据”案例的快照,然后从模拟DAL对象返回到业务层单元测试。这样可以避免创建遗漏生产数据中真实数据边缘案例的模拟

如果使用NUnt,请考虑使用他们的<代码>测试用例< /> >代码> >成对< /代码>和<代码>组合< /COD>属性来生成您的业务层对象的测试用例(而不是嘲笑它们)。您可能还会发现我的包装器库很方便


顺便说一句。。。您的
cls
类前缀命名约定是非标准的。

您试图解决什么问题?我想为SqlDataReader映射编写测试用例。因此,您的分包商不是。如果您对所编写的测试有特定的问题,或者对如何测试相关代码的研究有疑问,那么这些问题可能在主题中;但无法启动测试用例,无法从何处开始。@Sharad这些类已经被MS广泛测试过。无需重新发明轮子。如果需要,请检查您的设计并抽象数据访问,否则您描述的更像是单元测试中的集成测试。