yo estaba tratando de configurar una unidad de prueba para una clase interna privada, pero tuvo muy poco éxito:Cómo crear una instancia de PrivateType de clase privada interna
namespace Stats.Model
{
public class DailyStat
{
private class DailyStatKey // The one to test
{
private DateTime date;
public DateTime Date
{
get { return date; }
set { date = value.Date; }
}
public StatType Type { get; set; }
public override int GetHashCode()
{
return Date.Year * 1000000 +
Date.Month * 10000 +
Date.Day * 100 +
(int)Type;
}
public override bool Equals(object obj)
{
DailyStatKey otherKey = obj as DailyStatKey;
if (otherKey == null)
return false;
return (this.Date == otherKey.Date && this.StatType == otherKey.StatType);
}
}
}
}
Probé este código:
PrivateType statKeyType = new PrivateType("Stats.Model", "Stats.Model.DailyStat.DailyStatKey");
así como
PrivateType statKeyType = new PrivateType("Stats.Model", "DailyStat.DailyStatKey");
En vano.
El nombre de la asamblea es "Stats.Model", y para mí el nombre del tipo parece correcto también, pero me acaba de obtener una excepción: "System.TypeLoadException: No se pudo cargar el tipo"
Entonces, ¿qué estoy haciendo incorrecto ?
PrivateType, a mi leal saber y entender, se basa en la reflexión, y supongo que es muy útil para este escenario, ya que no se puede tener una clase privada directamente debajo de un espacio de nombres.
EDIT:
Añadido aplicación plena de DailyStatKey. Lo que quiero probar es la singularidad de mi método GetHashCode. Como puede ver, trato de ajustar una fecha + tipo en una sola int.
En C#, "new SomeType (args)" no usa Reflection. En cambio, siempre es una llamada de constructor y llama a uno de los constructores disponibles. En su código de ejemplo, no hay ningún constructor, por lo que el único constructor disponible es el constructor predeterminado (constructor nulo - constructor sin args). Tampoco puedes llamar esto desde el exterior porque la clase es privada. Entonces tienes razón de que necesitas reflexión. – apollodude217
Pregunta relacionada: http: // stackoverflow.com/questions/3198912/use-reflection-or-a-property-when-unit-testing – apollodude217
¿No estoy seguro de por qué menciona la parte sobre constructores? Lo que quiero decir sobre PrivateType usando Reflection, es que lo usa para acceder a la clase/métodos privados. (Esto es bastante obvio desde la página de MSDN: http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.privatetype(VS.80).aspx ya que requiere ReflectionPermission. En cuanto a la pregunta relacionada, sí, soy consciente de que no se deben probar clases privadas, pero dado que solo se usa internamente y es crucial que GetHashCode siempre devuelva algo único, pensé que sería mejor hacer una prueba. – Steffen