Я пытаюсь выполнить модульный тест фрагмента кода, который должен быть в настоящее время вошедшим в систему пользователем в тесте. Используя поставщик членства .Net 2.0, как я могу программно войти в систему как пользователь для этого теста?программный логин с провайдером членства .net
ответ
Действительно ли ваш код нужен пользователю, зарегистрированному через ASP.NET, или ему просто нужен CurrentPrincipal? Я не думаю, что вам нужно программно войти на ваш сайт. Вы можете создать GenericPrincipal, установить необходимые вам свойства и прикрепить его, например, Thread.CurrentPrincipal или издевательский HttpContext. Если вашему коду действительно требуется RolePrincipal или что-то еще, я бы изменил код, чтобы он был менее связан с членством ASP.NET.
Использование вашего провайдера членства вы можете подтвердить использование пользователем Membership.ValidateUser. Затем вы можете настроить cookie аутентификации с помощью FormsAuthentication.SetAuthCookie. Пока у вас есть контейнер cookie, это должно позволить вам войти в систему.
Я нашел наиболее удобным создание одноразового класса, который обрабатывает настройку и сброс 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;
}
}
В тестовом методе просто обернуть вызов с помощью заявления, как это:
using (new TemporaryPrincipal(new AnonymousUserPrincipal())) {
ClassUnderTest.MethodUnderTest();
}
if(Membership.ValidateUser("user1",[email protected]))
{
FormsAuthentication.SetAuthCookie("user1",true);
}
Мне нужен вызов Membership.GetUser() для возврата в данный момент вошедшего в систему пользователя. – ddc0660 2008-10-30 16:10:30