Próbuję przeprowadzić test jednostkowy kodu, który potrzebuje aktualnie zalogowanego użytkownika w teście. Korzystając z dostawcy członkostwa .Net 2.0, w jaki sposób mogę programowo zalogować się jako użytkownik tego testu?programistyczne logowanie z dostawcą członkostwa .net
Odpowiedz
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.
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.
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();
}
if(Membership.ValidateUser("user1",[email protected]))
{
FormsAuthentication.SetAuthCookie("user1",true);
}
muszę wywołanie Membership.GetUser(), aby powrócić aktualnie zalogowanego użytkownika. – ddc0660
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. –