MSTest, аксессоры, наследование и частные члены - PullRequest
1 голос
/ 18 августа 2010

Я пытаюсь написать несколько тестов для приложения MVC, которое мы разрабатываем.У нас есть класс BaseController, который содержит следующее:

public class BaseController : Controller
{
    protected string UserRole { get; private set; }

Затем у нас есть контроллер, который наследуется от BaseController:

public class CustomFieldController : BaseController

Я создал частные средства доступа для обоих классов (простовозродил их несколько минут назад).В одном из моих модульных тестов для CustomFieldController я хочу установить UserRole, поэтому у меня есть следующий код:

CustomFieldController controller = new CustomFieldController();
CustomFieldController_Accessor accessor = new CustomFieldController_Accessor( 
    new PrivateObject( controller, new PrivateType( typeof( BaseController ) ) ) );

accessor.UserRole = "OTHER";

Каждый раз, когда я пытаюсь запустить этот тест, в последней строке выдается исключение:

Указанный элемент (CustomFieldEdit) не найден.Возможно, вам потребуется восстановить свой частный метод доступа, или член может быть закрытым и определенным для базового класса.Если последнее верно, вам нужно передать тип, который определяет член, в конструктор PrivateObject.

Насколько я могу судить, я сделал то, что он говорит.Мало того, что я недавно заново сгенерировал приватный метод доступа, но я передаю тип, который определяет член, в конструктор PrivateObject.

Есть мысли о том, что мне здесь не хватает?Я знаю, что могу заставить его работать, убрав «private» из установщика свойств, но я бы предпочел этого не делать, если я могу избежать этого (не хочу, чтобы разработчики подкласса думали, что они могут ввести значение в это свойство).

1 Ответ

4 голосов
/ 05 июля 2011

CustomFieldController controller = new CustomFieldController();<br> var po = new PrivateObject( controller, new PrivateType( typeof( BaseController ) ) );<br> CustomFieldController_Accessor accessor = new CustomFieldController_Accessor( po ); </p> <pre><code>po.SetFieldOrProperty("UserRole","OTHER");

...