Тестирование User.IsInRole в MVC.NET - PullRequest
3 голосов
/ 14 декабря 2009

Я пытаюсь проверить User.IsInRole («Администратор») в моем приложении и фактически пытаюсь назначить Роль пользователя («Администратор»), чтобы мой тест прошел. Для этого я использую MvcMockHelpers Скотта Хансельмана, и на данный момент у меня есть следующий тест.

    [Test]
    public void Create_CanInsertNewArticleView_IsNotNull()
    {
        // Arrange
        var controller = new ArticleController();

        MockRepository mockRepo = new MockRepository();
        var fakeContext = MvcMockHelpers.FakeHttpContext(mockRepo, "~/Article/Create");
        fakeContext.User.IsInRole("Administrator");

        // Act
        Article fakeArticle = FakeObjects.ReturnFakeArticle();

        var result = controller.Create(fakeArticle) as ViewResult;

        // Assert
        Assert.IsNotNull(result);
    }

Однако фактический пользователь контроллера в данный момент является нулевым.

Может кто-нибудь помочь мне и сказать, каким должен быть правильный тест, до User.IsInRole("Administrator")

Спасибо за вашу помощь и время

Johann

Ответы [ 2 ]

1 голос
/ 14 декабря 2009

Подробнее см. этот связанный ответ .


Вот фрагмент кода из другого ответа, преобразованного в Mhino Rhino:

var user = new GenericPrincipal(new GenericIdentity(string.Empty), null);
var httpCtx = MockRepository.GenerateStub<HttpContextBase>();
httpCtx.User = user;

var controllerCtx = new ControllerContext();
controllerCtx.HttpContext = httpCtx;

sut.ControllerContext = controllerCtx;
0 голосов
/ 14 декабря 2009

Вам нужно будет смоделировать IPrincipal для вашего пользовательского объекта, настроить его так, чтобы .IsInRole("Administrator") вернул true, а затем настроить fakeContext на возвращение этого IPrincipal для .User имущество. Было бы что-то вроде этого:

РЕДАКТИРОВАТЬ: Оказывается, ОП использует Rhino Mocks, и код, который я предоставил, был для Moq. Вот попытка написать код Rhino, хотя я сам никогда не использовал Rhino. Оригинальный код Moq можно найти ниже.

В Rhino Mocks вам нужно добавить другой вспомогательный метод или изменить текущий, чтобы у вас было следующее:

public static HttpContextBase FakeHttpContext(this MockRepository mocks, string url, IPrincipal user)
{
        // Do the same setup as Scott does...

        // ...and add this:
        SetupResult.For(context.User).Return(user);

        mocks.Replay(context);
        return context,
}

Затем вы объявляете и настраиваете свой фиктивный объект IPrincipal следующим образом перед вызовом FakeHttpContext и отправляете фиктивный объект в качестве третьего параметра.


В Мок:

fakeContext = MvcMockHelpers.FakeHttpContext("~/Article/Create");
fakeUser = new Mock<IPrincipal>();
fakeUser.Expect(usr => usr.IsInRole(It.IsAny<String>())).Returns(true);
fakeContext.Expect(context => context.User).Returns(fakeUser.Object);

(Отказ от ответственности: прошло некоторое время с тех пор, как я написал модульный тест, и этот код не был протестирован даже на ошибки компиляции. Следовательно, могут быть некоторые морщины, которые необходимо устранить, прежде чем использовать это код, но вы получите общее представление ...)

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