Как мне подделать вход пользователя в систему для модульного тестирования, используя fakeiteasy в asp.net mvc 2

Я только начал изучать и использовать 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(); };
}

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

ТИА,

Дэйвид


person DavidS    schedule 02.12.2010    source источник


Ответы (2)


Связавшись с Патриком Хагне, создателем 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 );
    };
}

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

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

person Darin Dimitrov    schedule 03.12.2010
comment
Привет, Дарин, спасибо за публикацию этого ответа. К сожалению, строка A.CallTo(() =› HomeController.User).Returns(fakePrincipal); вызывает ошибки, потому что HomeController является тестируемым объектом, а не поддельным объектом. Есть ли у вас какие-либо дополнительные предложения, чтобы заставить код работать? - person DavidS; 03.12.2010