2010-12-02 3 views
6

Я только начал изучать и использовать ASP.NET MVC 2, а также более активно участвовать в модульном тестировании моего кода. Мой вопрос заключается в том, как симулировать вход пользователя в систему, передавая учетные данные в моем тесте.Как подделать логин пользователя для модульного тестирования с использованием fakeiteasy в asp.net mvc 2

Я использую MSpec и пытаюсь поднять голову под фейкитеази, чтобы написать свой тест. До сих пор, я считаю, что я написал один тест правильно (он проходит условие теста), когда пользователь, не прошедший проверку подлинности, пытается получить доступ к странице.

Subject(typeof(HomeController))] 
public class context_for_a_home_controller_for_not_logged_user 
{ 
    protected static HomeController HomeController; 

    Establish context =() => 
    { 
     // Create controller 
     HomeController = new HomeController(); 

     HomeController.ControllerContext = A.Fake<ControllerContext>(); 
    }; 
} 

[Subject(typeof(HomeController))] 
public class when_the_home_page_is_requested : context_for_a_home_controller_for_not_logged_user 
{ 
    static ActionResult result; 

    Because of =() => 
     result = HomeController.Index(); 

    It should_return_the_log_in_page_if_user_not_logged_in =() => 
     { result.ShouldBeAView().And().ShouldUseDefaultView(); }; 
} 

Пока все хорошо. Тем не менее, я бы хотел протестировать сценарий, когда пользователь, прошедший проверку подлинности, попадает на домашний контроллер. Я застрял в том, как имитировать аутентифицированного пользователя, и любая помощь или совет будут приветствоваться.

ТИА,

Дэвид

ответ

3

После того, как в связи с Патриком Hagne, создатель FakeItEasy, он придумал следующее:

[Subject(typeof(HomeController))] 
public class context_for_a_home_controller_for_logged_user 
{ 
    protected static HomeController HomeController; 

    Establish context =() => 
    { 
     // Create controller 
     HomeController = new HomeController(); 

     HomeController.ControllerContext = A.Fake<ControllerContext>(); 
     var fakePrincipal = A.Fake<IPrincipal>(); 
     var fakeIdentity = new GenericIdentity("username"); 
     A.CallTo(() => fakePrincipal.Identity).Returns(fakeIdentity); 
     A.CallTo(() => HomeController.ControllerContext.HttpContext.User).Returns(fakePrincipal); 
    }; 
} 

Это сделал трюк! Спасибо, Патрик!

2

Вот как тоу мог подделать идентичность:

Subject(typeof(HomeController))] 
public class context_for_a_home_controller_for_a_logged_user 
{ 
    protected static HomeController HomeController; 

    Establish context =() => 
    { 
     // Create controller 
     HomeController = new HomeController(); 

     var fakeControllerContext = A.Fake<ControllerContext>(); 
     var fakeHttpContext = A.Fake<HttpContextBase>(); 
     var fakePrincipal = A.Fake<IPrincipal>(); 
     var fakeIdentity = new GenericIdentity("someusername"); 

     HomeController.ControllerContext = fakeControllerContext; 
     A.CallTo(() => fakeControllerContext.HttpContext).Returns(fakeHttpContext); 
     A.CallTo(() => fakeHttpContext.User).Returns(fakePrincipal);   
     A.CallTo(() => fakePrincipal.Identity).Returns(fakeIdentity); 
    }; 
} 

Теперь, когда вы используете HomeController.User свойство это будет указывать на поддельный принципала, который был предоставлен.

+0

Привет, Дарин, благодарю вас за сообщение этого ответа. К сожалению, строка A.CallTo (() => HomeController.User). Возвраты (fakePrincipal); вызывает ошибки, поскольку HomeController является объектом тестирования и не является поддельным объектом. Есть ли у вас какие-либо дополнительные предложения, чтобы получить код? – DavidS 2010-12-03 09:24:55

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

  • Нет связанных вопросов^_^