Modificador de acceso "interno" de C# al realizar pruebas unitarias


Soy nuevo en pruebas unitarias y estoy tratando de averiguar si debo comenzar a usar más modificador de acceso 'interno'. Sé que si usamos 'internal' y establecemos la variable de ensamblado 'InternalsVisibleTo', podemos probar funciones que no queremos declarar públicas desde el proyecto testing. Esto me hace pensar que siempre debería usar 'interno' porque al menos cada proyecto (¿debería?) tiene su propio proyecto de prueba. ¿Pueden decirme una razón por la que no debería hacer esto? Cuándo debo usar 'privado'?

Author: EricSchaefer, 2008-12-11

4 answers

Las clases internas deben ser probadas y hay un atributo assemby:

using System.Runtime.CompilerServices;

[assembly:InternalsVisibleTo("MyTests")]

Agregue esto al archivo de información del proyecto, por ejemplo, Properties\AssemblyInfo.cs.

 957
Author: EricSchaefer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-17 23:51:28

Si desea probar métodos privados, eche un vistazo a PrivateObject y PrivateType en el espacio de nombres Microsoft.VisualStudio.TestTools.UnitTesting. Ofrecen envoltorios fáciles de usar alrededor del código de reflexión necesario.

Docs: Tipo privado, PrivateObject

 98
Author: Brian Rasmussen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-09 12:39:09

También puede usar private y puede llamar a métodos privados con reflexión. Si está utilizando Visual Studio Team Suite tiene una funcionalidad agradable que generará un proxy para llamar a sus métodos privados por usted. Aquí hay un artículo de code project que demuestra cómo puede hacer el trabajo usted mismo para probar unitariamente métodos privados y protegidos:

Http://www.codeproject.com/KB/cs/testnonpublicmembers.aspx

En términos de qué modificador de acceso debe usar, mi la regla general es comenzar con privado y escalar según sea necesario. De esa manera, expondrá tan poco de los detalles internos de su clase como sea realmente necesario y ayudará a mantener los detalles de implementación ocultos, como deberían estar.

 8
Author: Steven Behnke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 01:53:23

Siga usando private por defecto. Si un miembro no debe estar expuesto más allá de ese tipo, no debe estar expuesto más allá de ese tipo, incluso dentro del mismo proyecto. Esto mantiene las cosas más seguras y ordenadas: cuando usas el objeto, es más claro qué métodos debes usar.

Dicho esto, creo que es razonable hacer que los métodos naturalmente privados sean internos para fines de prueba a veces. Prefiero eso a usar la reflexión, que es refactorización-hostil.

Uno algo a considerar podría ser un sufijo "ForTest":

internal void DoThisForTest(string name)
{
    DoThis(name);
}

private void DoThis(string name)
{
    // Real implementation
}

Entonces, cuando estás usando la clase dentro del mismo proyecto, es obvio (ahora y en el futuro) que realmente no deberías usar este método, solo está ahí para propósitos de prueba. Esto es un poco complicado, y no es algo que yo mismo haga, pero al menos vale la pena considerarlo.

 8
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 06:27:57