2016-08-04 76 views
-2

我有以下方法,并希望通过DataReader为映射结果编写单元测试用例。Hot编写使用Moq的SqlDataReader的单元测试用例

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

任何人都可以帮我解决这个问题吗?

+0

你想解决什么问题? –

+0

我想为SqlDataReader映射编写测试用例。 – Sharad

+1

SO不是您的分包商。如果您有关于您撰写的测试的具体问题,或者对如何测试相关代码所做的研究有疑问,那么这些问题可能与主题有关。 –

回答

1

我想你会好起来的治疗您的数据抽象层(DAL)接口和类(如IIMGAdvancedSearchDBProviderclsIMGAdvancedSearchSQLDBProvider)的组件,您集成测试而非单元测试

换句话说,结合数据库模式,触发器,种子测试数据+ DAL实现类(包括对ExecuteReader的调用)的测试。 DAL应该精简并排除业务逻辑。您通常会在数据库中为这些集成测试设置/拆卸测试数据。您可能还想为这些DAL集成测试类创建公共基类,以设置测试数据库连接以及可能的某些SQL日志记录。也可以使用边缘测试用例数据维护一个单独的测试数据库,或者以setup/teardowns注入这些数据。不要在这里嘲笑。

然后你可以单元测试业务层类上面通过嘲笑你的DAL接口IIMGAdvancedSearchDBProvider在使用该DAL接口的组件/类的返回值。我经常尝试先完成DAL测试,然后捕获“实际生产数据”案例的一些快照,然后从我的Mock DAL对象返回业务层单元测试。这样可以避免创建错过生产数据中的实际数据边缘案例的Mocks。

如果您使用NUnit的,可以考虑使用他们的TestCasePairwiseCombinatorial属性生成测试用例(而不是嘲笑他们)为您的业务层对象。您可能还会发现我的ShouldBe包装库方便。

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