2010-11-21 44 views
6

Tôi đang cố gắng để đơn vị kiểm tra các MembershipProvider, tuy nhiên tôi không thể tìm ra cách hay có bất kỳ nhu cầu kiểm tra đơn vị của nó ...ASP.NET - Đơn vị kiểm tra MembershipProvider

lớp kinh doanh của tôi:

public interface IAccountService 
{ 
    MembershipCreateStatus CreateUser(string userName, string password, string email); 
} 

public class AccountService : IAccountService 
{ 
    private readonly MembershipProvider provider; 

    public AccountService() : this(null) { } 
    public AccountService(MembershipProvider providera) 
    { 
     this.provider = providera ?? Membership.Provider; 
    } 

    public MembershipCreateStatus CreateUser(string userName, string password, string email) 
    { 
     if (String.IsNullOrEmpty(userName)) throw new ArgumentException("Value cannot be null or empty.", userName); 
     if (String.IsNullOrEmpty(password)) throw new ArgumentException("Value cannot be null or empty.", password); 
     if (String.IsNullOrEmpty(email)) throw new ArgumentException("Value cannot be null or empty.", email); 

     MembershipCreateStatus status; 
     provider.CreateUser(userName, password, email, null, null, true, null, out status); 

     return status; 
    } 
} 

Ví dụ duy nhất tôi đã tìm thấy cho đến nay yêu cầu "MockMembershipProvider" với thiết lập cơ sở dữ liệu cục bộ ... có vẻ hơi lạ đối với tôi.

Xin cảm ơn trước.

+1

Bạn cần trợ giúp chính xác ở đâu? Bạn có muốn nhận ý tưởng cho các bài kiểm tra đơn vị sẽ kiểm tra Nhà cung cấp của bạn không? – Wodzu

Trả lời

6

Có một "MockMembershipProvider với thiết lập cơ sở dữ liệu cục bộ" là lẻ vì một vài lý do.

Thông thường bạn không muốn mã truy cập dữ liệu thử nghiệm đơn vị. Các bài kiểm tra đơn vị của bạn sẽ chạy rất nhanh, và được chạy thường xuyên, và do đó không yêu cầu truy cập cơ sở dữ liệu. Đây là lý do tại sao bạn có thể giả lập tầng truy cập dữ liệu của bạn. Dữ liệu bền vững sẽ được chấp nhận cho thử nghiệm tích hợp, nhưng thường là không phải là thử nghiệm đơn vị.

Phần còn lại của câu trả lời này được dựa trên giả định rằng bạn không muốn nhấn DB trong bài kiểm tra đơn vị của bạn.


Cho dù bạn muốn đơn vị kiểm tra nhà cung cấp thành viên sẽ phụ thuộc vào những gì đang diễn ra trong đó.

  1. Nếu nhà cung cấp thành viên được viết tùy chỉnh và chứa logic nghiệp vụ thì đơn vị đó phải được kiểm tra đơn vị. Nếu đây là trường hợp bạn cần tạo đối tượng DAO giả trong vòng nhà cung cấp thành viên để nhà cung cấp thành viên có thể được thực hiện bằng các kiểm tra đơn vị mà không cần nhấn vào cơ sở dữ liệu.

  2. Nếu nhà cung cấp thành viên chỉ thực hiện truy cập cơ sở dữ liệu (trực tiếp hoặc chuyển tiếp cuộc gọi đến cấp truy cập dữ liệu), bạn không nên kiểm tra đơn vị đó. Nếu bạn đang sử dụng nhà cung cấp thành viên asp.net của Microsoft, bạn cũng không nên kiểm tra nó.

    Thay vào đó bạn nên tạo mô hình MembershipProvider để sử dụng trong lớp AccountService. Bạn sẽ bơm bằng cách sử dụng constructor injection giả, đây là mục đích của mã boilerplate sau

    public AccountService() : this(null) { } 
    public AccountService(MembershipProvider providera) 
    { 
        this.provider = providera ?? Membership.Provider; 
    } 
    

    Mã này tạo điều kiện constructor tiêm triển khai thay thế (trong đó bao gồm mocks). Ví dụ về thử nghiệm có thể trông như thế nào:

    [Test] 
        public void ExampleTestWithAHandRolledMock() 
        { 
         //arrange 
         var mockMembershipProvider = new MockMembershipProvider();//no db access in this mock implementation 
         var accountService = new AccountService(mockMembershipProvider); 
         //act 
         accountService.CreateUser("foo", "bar", "baz"); 
         //assert 
         Assert.IsTrue(mockMembershipProvider.MockUserExists("foo","bar","baz");//added a method to mock to confirm user was added 
        }