Creo que la mejor respuesta en situaciones como esta es pensar con mucho cuidado sobre lo que está tratando de probar. Idealmente, una prueba unitaria debería intentar probar un solo hecho sobre un único método o función. Cuando comienzas a combinar muchas cosas, se cruza con el mundo de las pruebas de integración (que son igualmente valiosas, pero diferentes).
Para probar la unidad, para que pueda probar solo lo que desea probar, necesitará diseño para probar. Esto generalmente implica el uso adicional de interfaces (estoy asumiendo .NET a partir del código que mostró) y alguna forma de inyección de dependencia (pero no requiere un contenedor IoC/DI a menos que desee uno). También se beneficia de, y lo alienta a crear clases muy cohesivas (de propósito único) y desacopladas (dependencias de software) en su sistema.
Por lo tanto, cuando prueba una lógica de negocios que depende de los datos de una base de datos, normalmente usaría algo como el Repository Pattern e inyectaría un fake/stub/mock IXXXRepository para pruebas unitarias. Cuando está probando el repositorio concreto, o bien necesita hacer el tipo de limpieza de la base de datos que está solicitando o necesita ajustar/anular la llamada a la base de datos subyacente. Eso depende de ti.
Cuando necesite crear/rellenar/limpiar la base de datos, puede considerar aprovechar los diversos métodos de instalación y desmontaje disponibles en la mayoría de los marcos de prueba. Pero tenga cuidado, porque algunos de ellos se ejecutan antes y después de cada prueba, lo que puede afectar seriamente el rendimiento de las pruebas de su unidad. Las pruebas que se ejecutan demasiado despacio no se ejecutarán con mucha frecuencia, y eso es malo.
En MS-Test, los atributos que usaría para declarar instalación/desmontaje son ClassInitialize, ClassCleanUp, TestInitialize, TestCleanUp. Otros marcos tienen construcciones con nombres similares.
Hay una serie de marcos que pueden ayudarle con la burla/stubbing: Moq, Rhino Mocks, NMock, TypeMock, Moles and Stubs (VS2010), VS11 Fakes (VS11 Beta), etc. Si está buscando marcos de inyección de dependencia, mira cosas como Ninject, Unity, Castle Windsor, etc.
También debe usar 'TearDown' (o su equivalente en su suite) para limpiar, ya que si la prueba falla, el código de limpieza no se ejecutará. –
¿Qué le parece tomar una excepción y luego volver a tirarla después de limpiarla? –
Jimmy Bogard (autor de * AutoMapper *) tiene un excelente artículo y herramienta: [Pruebas de bases de datos confiables con Respawn] (https://lostechies.com/jimmybogard/2015/02/19/reliable-database-tests-with-respawn /) –