Estoy probando una clase que es parte de una jerarquía. He estado configurando mis clases de prueba con el objeto bajo prueba, y un PrivateObject
para permitir el acceso a ese objeto. Recibo excepciones cuando intento acceder a miembros privados de la clase principal.¿Cómo puedo utilizar PrivateObject para acceder a miembros privados de mi clase y su principal?
La única solución que he encontrado hasta ahora es pasar un PrivateType
especificando la clase base al constructor PrivateObject
, pero luego no funciona en los miembros privados de la subclase.
¿Hay alguna manera de que pueda hacer esto, tal vez mediante el uso del parámetro de banderas de enlace en los métodos Get * del objeto privado?
Intenté utilizar las clases de Accessor generadas automáticamente (clic con el botón derecho en la clase principal, Crear intérprete privado). Sin embargo, eso es peor: muestra una propiedad que puedo leer, pero arroja la misma excepción que PrivateObject, y no hay otras opciones que pueda usar (banderas de encuadernación o lo que sea) para arreglar la excepción.
Aquí está mi código de prueba de muestra. Me gustaría que haya alguna forma de construir y usar PrivateObject para recuperar ambos campos.
public class BaseClass
{
private int one = 1;
}
public class SubClass : BaseClass
{
private int two = 2;
}
[TestClass]
public class UnitTest1
{
BindingFlags flags = BindingFlags.FlattenHierarchy | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance;
[TestMethod]
public void TestMethod1()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test);
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.SubClass.one' not found.
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags));
}
[TestMethod]
public void TestMethod2()
{
SubClass test = new SubClass();
PrivateObject priv = new PrivateObject(test, new PrivateType(typeof(BaseClass)));
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("one", flags));
Assert.AreNotEqual<int>(0, (int)priv.GetFieldOrProperty("two", flags)); // System.MissingMethodException: Method 'PrivateObjectTester.BaseClass.two' not found.
}
}
Como nota al margen, puede acceder a los miembros protegidos utilizando PrivateObject –