Как да фалшифицирам влизане на потребител за целите на тестване на единица, използвайки 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(); };
}

Дотук добре. Бих искал обаче да тествам сценария за това, когато удостоверен потребител удари домашния контролер. Заседнал съм в това как да симулирам удостоверен потребител и всяка помощ или съвет би бил добре дошъл.

TIA,

Дейвид


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