2008-10-28 29 views

Trả lời

1

Mã của bạn có thực sự cần người dùng đăng nhập qua ASP.NET hay chỉ cần một CurrentPrincipal? Tôi không nghĩ rằng bạn cần đăng nhập vào trang web của bạn theo cách lập trình. Bạn có thể tạo một GenericPrincipal, đặt các thuộc tính bạn cần và đính kèm nó vào, ví dụ Thread.CurrentPrincipal hoặc một HttpContext giả lập. Nếu mã của bạn thực sự cần RolePrincipal hoặc một cái gì đó sau đó tôi sẽ thay đổi mã để được ít hơn cùng với thành viên ASP.NET.

+0

tôi cần những lời kêu gọi Membership.GetUser() để trả lại hiện đang đăng nhập người dùng. – ddc0660

+2

Đừng gọi Memberhip.GetUser() trực tiếp trong lớp đang được kiểm tra. Cung cấp lớp với một IGetUser trong quá trình tạo, sử dụng nó thay cho Membership.GetUser(), sau đó thực hiện một giả lập của IGetUser để thử nghiệm. –

0

Sử dụng nhà cung cấp tư cách thành viên của bạn, bạn có thể xác thực người dùng bằng Membership.ValidateUser. Sau đó, bạn có thể đặt cookie xác thực bằng cách sử dụng FormsAuthentication.SetAuthCookie. Miễn là bạn có một thùng chứa cookie, điều này sẽ cho phép bạn đăng nhập vào một người dùng.

2

Tôi thấy thuận tiện nhất khi tạo lớp dùng một lần xử lý cài đặt và đặt lại 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; 
     } 
    } 

Trong phương pháp thử nghiệm bạn chỉ cần quấn cuộc gọi của bạn với một tuyên bố sử dụng như thế này:

using (new TemporaryPrincipal(new AnonymousUserPrincipal())) { 
    ClassUnderTest.MethodUnderTest(); 
} 
13
if(Membership.ValidateUser("user1",[email protected])) 
     { 
      FormsAuthentication.SetAuthCookie("user1",true); 
} 
Các vấn đề liên quan