2015-03-25 5 views
1

Итак, я пару раз прорабатывал это в течение нескольких часов, и я еще не нашел рабочего решения.Испытания на модуле MVC [Авторизовать (Роли = «Роль»)]

Вот несколько вопросов, которые я нашел, которые рисуют картину того, что я делал, но никто не дает мне рабочий ответ.

How do I unit test a controller method that has the [Authorize] attribute applied?

Unit testing ASP.Net MVC Authorize attribute to verify redirect to login page

То, что я пытаюсь сделать, это написать блок, который проверяет [Авторизовать (Roles = «Роль»)] атрибут на мой контроллер фактически разрешает/запрещает доступ к контроллер на основе текущего пользователя, принадлежащего/не принадлежащего к определенной роли.

Код ниже всегда возвращает представление, даже если я устанавливаю IsInRole в false, поэтому я считаю, что он игнорирует атрибут Authorize.

[TestMethod] 
    public void Auth_User_Can_Access() 
    { 
     //this test mocks a user and submits it as part of the context to the controller 
     //Arrange 
     Mock<IPrincipal> mockP = new Mock<IPrincipal>(); 
     mockP.SetupGet(p=>p.Identity.Name).Returns("UnitTesting"); 
     mockP.Setup(p=>p.IsInRole("Role")).Returns(false); //"Role" is not the actual role name. 

     Mock<ControllerContext> mockC = new Mock<ControllerContext>(); 
     mockC.SetupGet(p=>p.HttpContext.User).Returns(mockP.Object); 
     mockC.SetupGet(p=>p.HttpContext.Request.IsAuthenticated).Returns(true); 

     AppsController target = new AppsController(mock.Object); 
     target.ControllerContext = mockC.Object; 

     // Act 
     ViewResult result = target.Index() as ViewResult; 

     // Assert 
     Assert.IsNotNull(result); 
    } 

У меня явно что-то отсутствует.

Для полноты здесь это начало моего кода контроллера также

[Authorize(Roles = "Role")] 

public class AppsController : Controller 
{ 
    private IAppRepository db; 

    public AppsController (IAppRepository appRepository) 
    { 
     db = appRepository; 
    } 

    // GET: Apps 

    public ViewResult Index() 
    { 
     return View(db.Apps.ToList()); 
    } 
+0

.IsAuthenticated.Returns (False) также не имеет значения. – codemonkeytony

+0

Если бы вы следовали ссылкам в ваших ссылках, вы бы пришли к правильному ответу: http://stackoverflow.com/a/670838/126014 –

+0

@MarkSeemann не могли бы вы подробно рассказать? «Я явно что-то пропустил». – codemonkeytony

ответ

1

Вы можете написать модульное тестирование с помощью Xania.AspNet.Simulator

new AppsController(appRepo).Action(c => c.Index()) 
    .Authenticate("user1", new []{"Role"}) 
    .Authorize().Should().BeNull(); // authorized 

new AppsController(appRepo).Action(c => c.Index()) 
    .Authenticate("user1", new []{"Dummy"}) 
    .Authorize().Should().BeOfType<HttpUnauthorizedResult>(); // not authorized 

для получения дополнительной информации, пожалуйста, обратитесь к http://www.codeproject.com/Tips/850277/ASP-NET-MVC-End-to-End-Integration-Testing

Смежные вопросы