Я тестирую класс, который является частью иерархии. Я настраивал свои тестовые классы с тестируемым объектом и PrivateObject
, чтобы разрешить доступ к этому объекту. Я получаю исключения, когда пытаюсь получить доступ к закрытым членам родительского класса.
Единственным обходным решением, которое я нашел до сих пор, является передача PrivateType
, указывающая базовый класс на конструктор PrivateObject
, но затем он не работает с частными членами подкласса.
Есть ли способ, которым я могу это сделать, возможно, используя параметр флаги привязки в методах Get * объекта Private?
Я попытался использовать автоматически созданные классы Accessor (щелкните правой кнопкой мыши в основном классе, Create Private Accessor). Тем не менее, это хуже: он показывает свойство, которое я могу прочитать, но он генерирует то же исключение, что и privateObject, и нет никаких других параметров, которые я могу использовать (флаги привязки или что-то еще), чтобы исправить исключение.
Вот мой примерный тестовый код. Я бы хотел, чтобы был какой-то способ построить и использовать PrivateObject для извлечения обоих полей.
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.
}
}