Итак, я пару раз прорабатывал это в течение нескольких часов, и я еще не нашел рабочего решения.Испытания на модуле 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());
}
.IsAuthenticated.Returns (False) также не имеет значения. – codemonkeytony
Если бы вы следовали ссылкам в ваших ссылках, вы бы пришли к правильному ответу: http://stackoverflow.com/a/670838/126014 –
@MarkSeemann не могли бы вы подробно рассказать? «Я явно что-то пропустил». – codemonkeytony