El atributo "InternalsVisibleTo" es clave para cualquier tipo de prueba de "caja blanca" (el término de la década, supongo) para .Net. Se puede colocar en cualquier archivo C # con el atributo "ensamblado" en el frente. Tenga en cuenta que los MS DOC dicen que el nombre del ensamblado debe ser calificado por el token de clave pública, si está firmado. A veces eso no funciona y uno debe usar la clave pública completa en su lugar. El acceso a componentes internos es clave para probar sistemas concurrentes y en muchas otras situaciones. Ver https://www.amazon.com/xUnit-Test-Patterns-Refactoring-Code/dp/0131495054 . En este libro, Meszaros describe una variedad de estilos de codificación que básicamente constituyen un enfoque de "Diseño para prueba" para el desarrollo de programas. Al menos así lo he usado a lo largo de los años.
AGREGADO: Lo siento, no he estado aquí por un tiempo. Un enfoque es llamado el enfoque de "subclase de prueba" por Meszaros. Nuevamente, uno tiene que usar "internalsvisableto" para acceder a los componentes internos de la clase base. Esta es una gran solución, pero no funciona para clases selladas. Cuando enseño "Design For Test", sugiero que es una de las cosas que se deben "pre-diseñar" en las clases base para proporcionar capacidad de prueba. Tiene que convertirse en algo casi cultural. Diseñe una clase base "base" que no esté sellada. Llámelo UnsealedBaseClass o algo uniformemente reconocible. Esta es la clase que se subclasificará para la prueba. También se subclasifica para construir la clase sellada de producción, que a menudo solo difiere en los constructores que expone. Trabajo en la industria nuclear y los requisitos de prueba se toman MUY en serio. Entonces, tengo que pensar en estas cosas todo el tiempo. Por cierto, dejar los ganchos de prueba en el código de producción no se considera un problema en nuestro campo, siempre y cuando sean "internos" en una implementación .Net. Las ramificaciones de NO probar algo pueden ser bastante profundas.