Зависит от случая, но на старых системах, где я не хочу заглушать базу данных, я часто представляю интерфейс, скажем, IFooDBManager, у которого есть методы, которые возвращают объекты ADO.Net, такие как таблицы данных или наборы данных. Конечно, это не обязательно должен быть интерфейс, но это может быть, например, виртуальный метод. Затем в своих тестах я использую небольшой API с гибким интерфейсом, который я создал сам давно, я использую его для создания наборов данных и таблиц и заполнения их тестовыми значениями, чтобы я мог вернуть их из своих подделок.
Свободный интерфейс выглядит примерно так:
return DataTableBuilder.Create()
.DefineColumns("a, b")
.AddRow().SetValue("a", 1).SetValue("b", 2).DoneWithRow()
.AddRow().SetValue("a", 10).SetValue("b", 20).DoneWithRow()
.Table
Как я уже сказал, это только один из подходов, которые я использую, и это в основном для устаревших систем, где я не хочу вводить новые зависимости от работы с фреймами и тому подобное. Однако это метод, который я не видел у многих других людей, поэтому я подумал, что стоит упомянуть.
EDIT:
Я забыл уточнить, что это для заглушения базы данных, поэтому взаимодействие с базой данных в этом случае не проверяется. Фактическое взаимодействие будет происходить в конкретной реализации IFooDBManager, чтобы проверить , что что-то еще полностью необходимо.
Кроме того, не все методы в таком интерфейсе, конечно, возвращают вещи, есть также методы для записи в базу данных, и я обычно проверяю их, проверяя взаимодействие в RhinoMocks, где я устанавливаю ожидания для этих методов.