PrivateObject не находит собственности - PullRequest
4 голосов
/ 03 февраля 2011

У меня есть структура, которая выглядит примерно так:

abstract class A
{
   protected string Identificator { get; set; }

   private void DoSomething()
   {

       // ...

       DoSomethingSpecific();
   }

   protected abstract void DoSomethingSpecific();
}

Из-за сложности мне нужно выполнить модульное тестирование метода DoSomething, чтобы убедиться, что он всегда работает одинаково.Вот почему я создал следующую заглушку.

public class AStub : A
{
    protected override void DoSomethingSpecific()
    {
        // nothing to do
    }
}

Я использую класс PrivateObject для доступа к методам и свойствам класса A, являющегося экземпляром класса AStub.Это работало некоторое время, и по какой-то причине теперь происходит сбой, когда я пытаюсь получить доступ к свойству или методу.

следующий код для тестирования:

var sut = new CommonIodAdapterImpl();
var accessor = new PrivateObject(sut);

accessor.SetProperty("Identificator", "blablub");
accessor.Invoke("DoSomething", null);

// assert...

Исключение, которое выдаетсяMissingMethodException говорит мне, что свойство или метод не был найден.Но когда я отлаживаю и проверяю иерархию, кажется, что все правильно, включая орфографию.

Спасибо за вашу помощь.

Ответы [ 4 ]

10 голосов
/ 15 мая 2013

Вам необходимо установить аргумент PrivateType для вашего базового класса для доступа к закрытым членам на этом уровне.

var accessor = new PrivateObject(sut, new PrivateType(typeof(A)));
1 голос
/ 18 февраля 2011

Я только что попробовал нечто подобное, я предположил, что это потому, что собственность защищена, а не частная.

Я создал свой собственный аксессор в моей тестовой сборке

public class AAccessor : A
{
    // use this instead of Identificator
    public string IdentificatorAccessor 
    {
        get { return this.Identificator; }
        set { this.Identificator = value; }
    }

    // test this method in your unit test
    public void DoSomethingAccessor()
    {
        this.DoSomethingSpecific()
    }

    // need this to satisfy the abstract class
    protected override void DoSomethingSpecific()
    {
        // do nothing here
    }
}
1 голос
/ 03 февраля 2011

Разве это не должно быть "открытый класс AStub: A"?

Чтобы устранить исключение из отсутствующего метода, просто скомпилируйте все (!) Еще раз.Либо вы получите какую-то ошибку компилятора, сообщающую вам, что не так, либо ошибка исчезнет.

Если она все еще не работает, проверьте, если у вас нет нескольких копий сборок (включая GAC!), И просмотритеокно Deboug-Out, если оно загружает сборки с правильного пути.

0 голосов
/ 04 апреля 2018
public class BaseClass
{
   private int _fieldToSet;
   ...
}

public class DerivedClass : BaseClass
{
   ...
}

// Unit Test Code

public void Test()
{
   DerivedClass d = new DerivedClass();
   PrivateObject privObj = new PrivateObject(d, new PrivateType(typeof(BaseClass));
   privObj.SetFieldOrProperty("fieldToSet", 8675309);
   ...
}
...