Вместо использования DbConnection вы можете использовать IDbConnection и высмеивать его? Мы делаем нечто подобное, передаем макет DataSet. DataSet.CreateDataReader возвращает DataTableReader, который наследуется от DbDataReader.
Мы обернули DbConnection в наш собственный интерфейс, подобный IDbConnection, к которому мы добавили метод ExecuteReader (), который возвращает класс, реализующий те же интерфейсы, что и DbDataReader. В нашем макете ExecuteReader просто возвращает то, что обслуживает DataSet.CreateDataReader.
Звучит как обход, но очень удобно создать DataSet с возможно большим количеством наборов результатов. Мы называем DataTables в честь хранимых процедур, для которых они представляют результаты, и наша модель IDbConnection выбирает правильный Datatable на основе процедуры, вызываемой клиентом. DataTable также реализует CreateDataReader, поэтому мы готовы идти.