2016-08-04 18 views
-2

Ich habe folgende Methoden und möchte den Unit-Testfall für Mapping-Ergebnis durch DataReader schreiben.Heiss zu schreiben Einheit Testfall für SqlDataReader mit Moq

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

Kann mir jemand helfen, dies zu lösen?

+0

Was versuchen Sie zu lösen? –

+0

Ich möchte Testfälle für SqlDataReader-Mapping schreiben. – Sharad

+1

SO ist nicht Ihr Subunternehmer. Wenn Sie ein bestimmtes Problem mit einem Test haben, den Sie geschrieben haben, oder eine Frage zu einer Recherche haben, die Sie zum Testen Ihres relevanten Codes durchgeführt haben, dann sind diese möglicherweise Thema. –

Antwort

1

Ich glaube, Sie besser dran sein, Ihre Daten-Abstraktionsschicht (DAL) Schnittstellen und Klassen (wie IIMGAdvancedSearchDBProvider und clsIMGAdvancedSearchSQLDBProvider) als Komponenten der Behandlung, die Sie Integrationstest statt Unit-Test.

Mit anderen Worten kombinieren Sie das Testen des Datenbankschemas, der Trigger, der Testdaten und Ihrer DAL-Implementierungsklasse (einschließlich des Aufrufs an ExecuteReader). DALs sollten dünn sein und Geschäftslogik wie bei Ihnen ausschließen. Für diese Integrationstests würden Sie in der Regel Testdaten in der Datenbank einrichten/entfernen. Sie können auch eine gemeinsame Basisklasse für diese DAL-Integrationstestklassen erstellen, um Ihre Testdatenbankverbindung und möglicherweise einige SQL-Protokolle einzurichten. Könnte auch eine separate Testdatenbank mit Edge-Test-Falldaten verwalten oder diese Daten anderweitig in Setup/Teardowns einbringen. Keine Verspottung hier.

Dann können Sie Unit-Test die Business-Schicht-Klassen über ihm durch die Werte von Ihrem DAL Schnittstelle IIMGAdvancedSearchDBProvider in den Komponenten/Klassen zurück spöttisch, die die DAL-Schnittstelle verwenden. Ich versuche oft, zuerst den DAL-Test abzuschließen und einige Schnappschüsse von "echten Produktionsdaten" -Fällen zu erfassen, die ich dann von meinen Mock-DAL-Objekten zu den Business-Layer-Unit-Tests zurücksende. Dies vermeidet das Erstellen von Sperren, die die tatsächlichen Datenrandfälle in den Produktionsdaten übersehen. Wenn Sie NUnit verwenden, sollten Sie die Attribute TestCase, Pairwise und Combinatorial verwenden, um Testfälle für Ihre Business-Schicht-Objekte zu generieren (anstatt sie zu verspotten). Sie können auch meine ShouldBe Wrapper-Bibliothek finden.

BTW ... Ihre cls Klassenpräfix Namenskonvention ist nicht Standard.