2008-10-28 11 views

Odpowiedz

1

Czy Twój kod rzeczywiście potrzebuje użytkownika zalogowanego w ASP.NET, czy po prostu potrzebuje CurrentPrincipal? Nie sądzę, żebyś musiał programowo zalogować się do swojej witryny. Możesz utworzyć GenericPrincipal, ustawić wymagane właściwości i dołączyć je, na przykład Thread.CurrentPrincipal lub wyszydzony HttpContext. Jeśli twój kod rzeczywiście potrzebuje RolePrincipal lub coś takiego, to chciałbym zmienić kod, aby był mniej sprzężony z członkostwem ASP.NET.

+0

muszę wywołanie Membership.GetUser(), aby powrócić aktualnie zalogowanego użytkownika. – ddc0660

+2

Nie wywołuj Membership.GetUser() bezpośrednio w testowanej klasie. Zaopatrz klasę w IGetUser w tworzenie, użyj jej w miejsce Membership.GetUser(), a następnie zrób sztuczną implementację IGetUser do testowania. –

0

Korzystając z usługodawcy członkowskiego, można sprawdzić użytkownika przy użyciu narzędzia Membership.ValidateUser. Następnie możesz ustawić plik cookie uwierzytelniania za pomocą FormsAuthentication.SetAuthCookie. Tak długo, jak masz pojemnik z ciasteczkami, powinno ci to umożliwić zalogowanie się do użytkownika.

2

Najwygodniej było utworzyć klasę jednorazową, która obsługuje ustawianie i resetowanie Thread.CurrentPrincipal.

public class TemporaryPrincipal : IDisposable { 
     private readonly IPrincipal _cache; 

     public TemporaryPrincipal(IPrincipal tempPrincipal) { 
      _cache = Thread.CurrentPrincipal; 
      Thread.CurrentPrincipal = tempPrincipal; 
     } 

     public void Dispose() { 
      Thread.CurrentPrincipal = _cache; 
     } 
    } 

W metodzie testowej po prostu zawinąć rozmowy z wykorzystaniem rachunku tak:

using (new TemporaryPrincipal(new AnonymousUserPrincipal())) { 
    ClassUnderTest.MethodUnderTest(); 
} 
13
if(Membership.ValidateUser("user1",[email protected])) 
     { 
      FormsAuthentication.SetAuthCookie("user1",true); 
}