[英]Mocking Membership
我正在編寫自定義配置文件提供程序,但我仍打算使用默認的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()調用以便我可以為此方法編寫測試? 有什么建議或例子嗎? 謝謝。
我也遇到了這個問題
問題在於,沒有參數的方法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);
}
}
你可以將一個MembershipProvider
實例注入你的配置文件提供程序,如果沒有注入,可以使用Membership.Provider
嗎?
public MembershipProvider MembershipProvider
{
get { return _membershipProvider ?? Membership.Provider; }
set { _membershipProvider = value; }
}
您的配置文件提供程序將通過此屬性返回的值與成員資格提供程序進行交互。 在您的測試中,您將注入假/模擬MembershipProvider
實例。
如果您只是想在成員資格上模擬靜態方法,我猜你必須使用像TypeMock這樣的東西。
在ASP.NET MVC中,他們通過在MebershipService中封裝(包裝)成員資格功能來解決這個問題。 其中(例如:通過注射)您可以輕松地在測試中進行模擬。
模擬服務的一個例子...... http://www.asp.net/learn/mvc/tutorial-30-cs.aspx他們不使用注入。
一個很好的例子實際上是創建ASP.NET應用程序時生成的測試項目。 在下面的代碼中,您可以看到它們如何模擬FormsAuthentication和Membership對象:
[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.");
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.