2016-03-10 9 views
0

Я реализую интерфейс в класс C#, чья работа в основном заключается в том, чтобы вызвать некоторые хранимые процедуры T-SQL и вернуть данные. Другие реализации интерфейса могут получать данные через веб-службы, читать файлы и т. Д., Поэтому для проверки этого конкретного класса я идеально издевался над базой данных SQL Server и ее процедурами.Стыковка вызовов хранимых процедур SQL Server?

Я не уверен, насколько это возможно. Я видел такие инструменты, как RhinoMock, используемые для извлечения базы данных таблиц, но так как вся цель моего кода заключается в том, чтобы поговорить с БД, могу ли я высмеять всю БД или это немного пустая трата времени? В идеале я хотел бы, чтобы прозрачно предоставить замену для реальной БД, поэтому можно провести локальное тестирование, делая реальные вызовы хранимой процедуры против поддельной БД.

+0

Вы уверены, что @inquisitive_mind? Это было бы идеально, но: http://stackoverflow.com/questions/3335162/creating-stored-procedure-and-sqlite –

+0

@montewhizdoh, возможно, вы правы! –

+0

Я думаю, все зависит. Вы действительно не хотите писать модульные тесты, которые в конечном итоге заканчивают тестирование кода, отличного от того, что вы написали. Тестирование, чтобы увидеть, работает ли соединение, относится к этой серой области: «Я тестирую SQL Server, или я тестирую свой код?» и «я использую правильную строку соединения?». Лучше спросить: какие существуют кодовые пути, входящие и исходящие из хранимой процедуры? Являются ли тесты коаксичными с функциональными вариантами использования? Если вы TDD, вы хотите, чтобы он был тесно связан с функциональными вариантами использования - в этот момент все начнется очень хорошо. – code4life

ответ

0

Если вы строите модульные тесты, вам не следует выполнять хранимую процедуру, и вы должны заглушить этот интерфейс.

Если вы строите тесты интеграции, вы должны иметь все это.

В обоих случаях ваш класс не должен делать это напрямую, у вас должен быть внутренний обработчик, такой как IDbHandler, и во время ваших модульных тестов вы должны издеваться над ним, и в ходе интеграционных тестов вы должны использовать свою конкретную реализацию.

Целью создания макета является проверка того, что другая сторона (БД в вашем случае) получила запрос с ожидаемыми параметрами, но физический компонент не может быть издеваемым, поэтому просто добавив интерфейс между вашим кодом и физический компонент включит эти проверки.

BTW Я бы начал с проведения модульных тестов и сразу после этого добавил интеграционные тесты.

+0

Так, другими словами, один не отделяет класс, который вы создали, для реализации интерфейса, который вы ввели в аннотация хранимых процедур. – Maarten

+1

Я не уверен в стоимости модульных тестов здесь. Если класс должен просто вызвать sprocs, вы просто хотите убедиться, что имя sproc и именованные параметры совпадают с тем, что находится в БД. Похоже, это основное значение при тестировании этого конкретного класса. –