Как выполнить модульное тестирование действия контроллера MVC, который зависит от аутентификации в c #?

Я хотел бы написать (на c #) модульный тест для действия контроллера MVC, который мог бы возвращать одно или другое представление, в зависимости от того, аутентифицирован ли запрос. Как это может быть сделано?

Ответы на вопрос(2)

Решение Вопроса

Moq с помощью):

var request = new Mock<HttpRequestBase>();
request.SetupGet(x => x.IsAuthenticated).Returns(true); // or false

var context = new Mock<HttpContextBase>();
context.SetupGet(x => x.Request).Returns(request.Object);

var controller = new YourController();
controller.ControllerContext = 
       new ControllerContext(context.Object, new RouteData(), controller);

// test

ViewResult viewResult = (ViewResult)controller.SomeAction();

Assert.True(viewResult.ViewName == "ViewForAuthenticatedRequest");
 13 дек. 2016 г., 13:41
Это не работает для меня - возвращает одно и то же имя представления независимо от true / false
 Mats10 июл. 2009 г., 08:36
аккуратный. спасибо за Ваш ответ. ;)

что вы проверяете, что он аутентифицирован, и затем получаете доступ к объекту пользователя, чтобы получить идентификатор пользователя. ПользыRhinoMocks.

// mock context variables
var username = "user";
var httpContext = MockRepository.GenerateMock<HttpContextBase>();
var request = MockRepository.GenerateMock<HttpRequestBase>();
var identity = MockRepository.GenerateMock<IIdentity>();
var principal = MockRepository.GenerateMock<IPrincipal>();

httpContext.Expect( c => c.Request ).Return( request ).Repeat.AtLeastOnce();
request.Expect( r => r.IsAuthenticated ).Return( true ).Repeat.AtLeastOnce();
httpContext.Expect( c => c.User ).Return( principal ).Repeat.AtLeastOnce();
principal.Expect( p => p.Identity ).Return( identity ).Repeat.AtLeastOnce();
identity.Expect( i => i.Name ).Return( username ).Repeat.AtLeastOnce();

var controller = new MyController();
// inject context
controller.ControllerContext = new ControllerContext( httpContext,
                                                      new RouteData(),
                                                      controller );

var result = controller.MyAction() as ViewResult;

Assert.IsNotNull( result );

// verify that expectations were met
identity.VerifyAllExpectations();
principal.VerifyAllExpectations();
request.VerifyAllExpectations();
httpContext.VerifyAllExpectations();
 10 июл. 2009 г., 12:47
Не проблема. Это действительно тот же самый ответ. Я только оставил свой, потому что он показывает, как смоделировать принципал / личность в случае, если вам нужно получить имя пользователя - или метод IsInRole на принципале, который я не показал.
 Mats10 июл. 2009 г., 08:40
спасибо за ваш ответ, который, я уверен, работает отлично. так как я проверил eu-ge-ne ответ (который мне подходит), и он был немного быстрее с ответом, я пометил его ответ. без обид. хорошего дня. ;)

Ваш ответ на вопрос