2009-06-08 155 views
9

我正在寫一個自定義配置文件提供程序,但我仍然打算使用默認的AspNetSqlMembershipProvider作爲我的會員提供程序。在我的個人資料提供我GetAllProfiles()方法是這樣的:嘲笑會員

1 public override ProfileInfoCollection GetAllProfiles(ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords) 
2 { 
3  // Get the profiles 
4  IQueryable<Profile> profiles = _profileRepository.GetAllProfiles(); 
5  
6  // Convert to a ProfileInfoCollection 
7  ProfileInfoCollection profileInfoCollection = new ProfileInfoCollection(); 
8  foreach (Profile profile in profiles) 
9  { 
10   MembershipUser user = Membership.GetUser(profile.UserId); 
11 
12   string username = user.UserName; 
13   bool isAnonymous = false; 
14   DateTime lastActivity = user.LastActivityDate; 
15   DateTime lastUpdated = profile.LastUpdated; 
16 
17   ProfileInfo profileInfo = new ProfileInfo(username, isAnonymous, lastActivity, lastUpdated, 1); 
18 
19   profileInfoCollection.Add(profileInfo); 
20  } 
21 
22  // Set the total number of records. 
23  totalRecords = profiles.ToList().Count; 
24 
25  return profileInfoCollection; 
26 } 

如何嘲笑Membership.GetUser()調用,這樣我可以寫這種方法測試?任何建議或例子?謝謝。

回答

4

您可以注入一個MembershipProvider實例到您的配置文件提供程序中,如果沒有注入,請使用Membership.Provider重新使用嗎?

public MembershipProvider MembershipProvider 
{ 
    get { return _membershipProvider ?? Membership.Provider; } 
    set { _membershipProvider = value; } 
} 

您的配置文件提供程序將通過此屬性返回的值與成員資格提供程序進行交互。在你的測試中,你會注入假冒/模擬MembershipProvider實例。

如果你反而想嘲笑成員資格的靜態方法,你將不得不使用像TypeMock,我猜。

+0

是啊,我想使用TypeMock或起訂量,但我還沒有看到此特定情形的任何實例。我會按照你的建議玩一下注射,看看它是如何工作的。謝謝。 – 2009-06-08 21:05:02

6

我運行到這個問題,以及

問題就在於,如果沒有參數的方法的getUser()作爲在類的靜態方法來實現。

雖然Membership.Provider(當模擬)不包含不帶參數的GetUser()方法。

順便說說,這裏是我如何解決這個問題。我在我自己的類中封裝了靜態調用,該靜態調用實現了一個接口,因此可以被模擬。

public interface IStaticMembershipService 
{ 
    MembershipUser GetUser(); 

    void UpdateUser(MembershipUser user); 
} 

public class StaticMembershipService : IStaticMembershipService 
{ 
    public System.Web.Security.MembershipUser GetUser() 
    { 
     return Membership.GetUser(); 
    } 

    public void UpdateUser(MembershipUser user) 
    { 
     Membership.UpdateUser(user); 
    }  
} 
1

在ASP.NET MVC他們通過封裝(包裝)在MebershipService會員功能解決了這個。其中(例如:通過注入),您可以輕鬆地在您的測試中進行模擬。

嘲笑服務的一個例子... http://www.asp.net/learn/mvc/tutorial-30-cs.aspx雖然他們不使用注入。

一個很好的例子實際上是創建ASP.NET應用程序時生成的測試項目。在下面的代碼,你可以看到他們是如何嘲笑FormsAuthentication和成員對象:

[TestMethod] 
    public void ConstructorSetsProperties() 
    { 
     // Arrange 
     IFormsAuthentication formsAuth = new MockFormsAuthenticationService(); 
     IMembershipService membershipService = new AccountMembershipService(); 

     // Act 
     AccountController controller = new AccountController(formsAuth, membershipService); 

     // Assert 
     Assert.AreEqual(formsAuth, controller.FormsAuth, "FormsAuth property did not match."); 
     Assert.AreEqual(membershipService, controller.MembershipService, "MembershipService property did not match."); 
    }