我正在尝试对一段需要测试中当前已登录用户的代码进行单元测试。使用 .Net 2.0 成员资格提供程序,我该如何在测试中以编程方式作为用户登录?
我正在尝试对一段需要测试中当前已登录用户的代码进行单元测试。使用 .Net 2.0 成员资格提供程序,我该如何在测试中以编程方式作为用户登录?
if(Membership.ValidateUser("user1",P@ssw0rd))
{
FormsAuthentication.SetAuthCookie("user1",true);
}
我发现创建一个一次性类来处理设置和重置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();
}
你的代码实际上是否需要通过ASP.NET登录用户,还是只需要一个CurrentPrincipal?我认为你不需要在网站上编程登录。你可以创建一个GenericPrincipal,设置所需的属性,并将其附加到Thread.CurrentPrincipal或模拟的HttpContext等对象上。如果你的代码实际上需要RolePrincipal或其他东西,那么我会更改代码,使其与ASP.NET成员资格耦合度更低。
通过使用您的会员提供程序,您可以使用Membership.ValidateUser验证用户。然后,您可以使用FormsAuthentication.SetAuthCookie设置身份验证cookie。只要您有一个cookie容器,这应该允许您登录用户。