2016-08-04 5 views
-2

У меня есть следующие методы и вы хотите написать тестовый пример модуля для отображения результата через DataReader.Горячая запись блок-теста для SqlDataReader с использованием 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) 
     }; 
    } 
} 

Может ли кто-нибудь помочь мне разрешить это?

+0

Что вы пытаетесь решить? –

+0

Я хочу написать тестовые примеры для отображения SqlDataReader. – Sharad

+1

SO не является вашим субподрядчиком. Если у вас есть конкретная проблема с тестом, который вы написали, или у вас есть вопрос о том, как вы проводите исследование, как проверить свой соответствующий код, то это может быть по теме. –

ответ

1

Я думаю, что вы будете лучше обрабатывать ваши абстракции данных слоя (DAL) интерфейсы и классы (например, IIMGAdvancedSearchDBProvider и clsIMGAdvancedSearchSQLDBProvider) в качестве компонентов, которые вы интеграционный тест вместо модульного тестирования.

Другими словами, комбинируйте тестирование схемы базы данных, триггеров, данных семенного теста + вашего класса реализации DAL (включая вызов ExecuteReader). DAL должны быть тонкими и исключать бизнес-логику, как ваша. Для этих тестов интеграции вы обычно устанавливаете/тестируете тестовые данные в базе данных. Вы также можете создать общий базовый класс для этих классов тестирования интеграции DAL для настройки вашего подключения к тестовой базе данных и, возможно, некоторого ведения журнала SQL. Может также поддерживать отдельную тестовую базу данных с данными пограничного теста или иным образом вводить эти данные в настройках/отрывах. Нет.

Затем вы можете модульного тестирования классы бизнес-слой над ним, насмехаясь над значения, возвращаемые интерфейсе DAL IIMGAdvancedSearchDBProvider в компоненты/классы, которые используют интерфейс DAL. Я часто пытаюсь сначала завершить тестирование DAL и захватить некоторые снимки «реальных производственных данных», которые затем возвращаются из моих объектов Mock DAL в модульные тесты бизнес-уровня. Это позволяет избежать создания Mocks, которые пропускают реальные края данных, которые находятся в производственных данных.

Если вы используете NUnit, подумайте об использовании атрибутов TestCase, и Combinatorial для сгенерированных тестовых примеров (а не издеваться над ними) для объектов вашего бизнес-уровня. Вы также можете найти мою библиотеку обертки ShouldBe.

BTW ... Ваш cls Присвоение названия префикса класса нестандартно.

Смежные вопросы