Ложный IIdentity и IPrincipal - PullRequest
       11

Ложный IIdentity и IPrincipal

10 голосов
/ 02 октября 2008

Я просто хочу спросить, как лучше подходить к поставке этих объектов в моих юнит-тестах.

В моем модульном тесте я тестирую объект CSLA. Объект CSLA внутренне использует одно свойство и один метод объекта ApplicationUser. ApplicationUser наследуется от IPrincipal. Свойства: 1) ApplicationContext.User.IsInRole (...) - метод является частью IPrincipal 2) ApplicationContext.User.Identity.Name - имя является свойством IIdentity, которое является частью ApplicationUser aka IPricipal

Пример моего теста (с использованием RhinoMock):

public void BeforeTest()
{
   mocks = new MockRepository();
   IPrincipal mockPrincipal = mocks.CreateMock<IPrincipal>();
   ApplicationContext.User = mockPrincipal;
   using (mocks.Record()) {
      Expect.Call(mockPrincipal.IsInRole(Roles.ROLE_MAN_PERSON)).Return(true);
      Expect.Call(mockPrincipal.Identity.Name).Return("ju"); //doesn't work!!!! return null ref exc
   }
}

У меня небольшая проблема со вторым значением, именем личности. Я пытался имитировать его, но у меня возникла проблема с тем, чтобы назначить макет IIdentity для ApplicationUser, как это делается внутренне. Мне сказали просто создать какой-то IIPrincipal (в том числе IIdentity) самостоятельно, а не издеваться над ним вообще. Что можно сделать наверняка. Не уверен, что это можно назвать Stub с помощью?

Так что вы можете посоветовать мне, как обращаться с IPrincipal и IIdentity? Любое предложение приветствуется.

Ответы [ 2 ]

10 голосов
/ 07 июля 2009

Причина, по которой вы получаете нулевую ссылку, заключается в том, что IPrincipal.Identity равно нулю; это не было установлено в вашем высмеянном IPrincipal еще. Вызов .Name ноль Identity приведет к вашему исключению.

Ответ, как указал Карлтон, состоит в том, чтобы смоделировать IIdentity также и настроить его так, чтобы он возвращал "ju" для свойства Name. Тогда вы можете сказать IPrincipal.Identity, чтобы вернуть макет IIdentity.

Вот расширение вашего кода для этого (с использованием Rhino Mocks, а не Stubs):

public void BeforeTest()
{
   mocks = new MockRepository();
   IPrincipal mockPrincipal = mocks.CreateMock<IPrincipal>();
   IIdentity mockIdentity = mocks.CreateMock<IIdentity>();
   ApplicationContext.User = mockPrincipal;
   using (mocks.Record()) 
   {
      Expect.Call(mockPrincipal.IsInRole(Roles.ROLE_MAN_PERSON)).Return(true);
      Expect.Call(mockIdentity.Name).Return("ju"); 
      Expect.Call(mockPrincipal.Identity).Return(mockIdentity);
   }
}
4 голосов
/ 02 октября 2008

Вот код, который я использую для возврата тестового пользователя (используя заглушки):

    [SetUp]
    public void Setup()
    {
        var identity = MockRepository.GenerateStub<IIdentity>();
        identity.Stub(p => p.Name).Return("TestUser").Repeat.Any();
        var principal = MockRepository.GenerateStub<IPrincipal>();
        principal.Stub(p => p.Identity).Return(identity).Repeat.Any();

        Thread.CurrentPrincipal = principal;
    }

У меня есть linq в другом коде, поэтому я использую тип var для переменных; просто замените правильные типы (IPrincipal, IIdentity), если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...