2010-06-14 10 views
6

Tengo un ensamblado .NET, que se lanzará. Su versión de lanzamiento incluye:Ocultar el método público utilizado para ayudar a probar un ensamblado .NET

  • A, API documentado pública de métodos que la gente se supone que deben utilizar
  • una API pública, pero no documentada de otros métodos, que sólo existen con el fin de ayudar a probar la asamblea, y el que las personas se supone que no deben usar

El ensamblado que se lanzará es un control personalizado, no una aplicación. Para realizar una prueba de regresión, la ejecuto en un marco/aplicación de prueba, que utiliza (además de la API pública/documentada) algunos métodos avanzados/no documentados que se exportan desde el control.

Para los métodos públicos que no quiero que la gente utilice, les excluido de la documentación utilizando la etiqueta <exclude> (apoyado por el constructor castillo de arena Archivo de ayuda), y el atributo [EditorBrowsable], por ejemplo como este:

/// <summary> 
/// Gets a <see cref="IEditorTransaction"/> instance, which helps 
/// to combine several DOM edits into a single transaction, which 
/// can be undone and redone as if they were a single, atomic operation. 
/// </summary> 
/// <returns>A <see cref="IEditorTransaction"/> instance.</returns> 
IEditorTransaction createEditorTransaction(); 

/// <exclude/> 
[EditorBrowsable(EditorBrowsableState.Never)] 
void debugDumpBlocks(TextWriter output); 

Esto quita con éxito el método de la documentación API y de Intellisense. Sin embargo, si en un programa de aplicación de ejemplo que haga clic derecho en una instancia de la interfaz para ver su definición en los metadatos, todavía puedo ver el método y el [EditorBrowsable] atribuir, así, por ejemplo:

// Summary: 
//  Gets a ModelText.ModelDom.Nodes.IEditorTransaction instance, which helps 
//  to combine several DOM edits into a single transaction, which can be undone 
//  and redone as if they were a single, atomic operation. 
// 
// Returns: 
//  A ModelText.ModelDom.Nodes.IEditorTransaction instance. 
IEditorTransaction createEditorTransaction(); 
// 
[EditorBrowsable(EditorBrowsableState.Never)] 
void debugDumpBlocks(TextWriter output); 

Preguntas:

  • ¿hay una manera de ocultar un método público, incluso de los metadatos?
  • En caso negativo, en su lugar, para este escenario, ¿recomendaría hacer los métodos internal y usar el atributo InternalsVisibleTo? ¿O recomendarías de otra manera, y si es así, qué y por qué?

Gracias.

+5

Recomendaría un diseño adecuado que no requiera que exponga públicamente el código que prefiere ocultar. –

+0

De acuerdo con Mark. Debería poder probar todo su código a través de sus interfaces públicas sin tener que crear métodos públicos "ocultos" y/o internos. –

+0

@Mark Estoy [probando el código a través de interfaces públicas] (http://stackoverflow.com/questions/856115), pero para ayudarme con la prueba de regresión tengo algunos métodos adicionales, p. que vuelcan el estado interno del control: para que el caso de prueba pueda afirmar el estado interno (no documentado) después de varios eventos de entrada (públicos, documentados). – ChrisW

Respuesta

0

Las dos posibilidades son InternalsVisibleTo, y/o reflejo. No estoy al tanto de ninguna razón fuerte para preferir uno sobre la idea.

6

internal/InternalsVisibleTo es un buen enfoque, pero todavía genera los métodos en el código compilado y estarán disponibles a través de la reflexión.

Siempre puede usar un símbolo de compilación condicional para pruebas unitarias que solo agrega los métodos de prueba y, al crear su versión de lanzamiento, no define ese símbolo. De esta forma, los métodos simplemente no existen cuando no están construidos en la configuración de "Prueba".

+0

+1 usó símbolos como este en el pasado, de lejos la manera más fácil de hacerlo. –

+0

No me importa que los hackers usen la reflexión; Simplemente no quiero que los consumidores comunes del control vean métodos no documentados. Además, la compilación condicional no funcionaría porque yo [prueba la versión de lanzamiento] (http://stackoverflow.com/questions/420343). – ChrisW

+0

Si crea otra configuración que solo difiere de la versión de lanzamiento al tener los métodos adicionales, termina siendo la misma. No necesita estar en la configuración de depuración para definir otros símbolos. – CMerat

0

Personalmente usaría el modificador del compilador, pero siempre podría usar el reflejo en el código de prueba de la unidad para llegar a los miembros privados.

+0

Dado que no usaré la compilación condicional porque quiero [probar la compilación de versión] (http://stackoverflow.com/questions/420343), ¿sabe si sería mejor usar la reflexión, o usar ' ¿Cualidad de InternalsVisibleTo'? – ChrisW

+0

Si las únicas diferencias entre las dos versiones de código van a ser la firma de un método que cambia de privado a público, yo diría que esto no afecta la cobertura de la prueba lo suficiente como para ser un problema. Si algo se rompe, es muy probable que el compilador lo detecte de todos modos. Usaría la reflexión, es interna y no quieres que salga, así que tranquilízate. –

Cuestiones relacionadas