Как мне подделать вход пользователя в систему для целей модульного тестирования с использованием fakeiteasy в asp.net mvc 2 - PullRequest
6 голосов
/ 02 декабря 2010

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

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

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(); };
}

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

TIA,

David

Ответы [ 2 ]

3 голосов
/ 03 декабря 2010

После контакта с Патриком Хэгни, создателем 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 голосов
/ 03 декабря 2010

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

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, оно будет указывать на предоставленный поддельный принципал.

...