2009-06-08 2 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 или Moq, но я не видел никаких примеров для этого конкретного сценария. Я буду играть с инъекцией, как вы предложили посмотреть, как это работает. Благодарю. –

6

Я бегу в эту проблему, а

проблема заключается в том, что метод GetUser() без параметров реализуется как статический метод на классе.

Принимая во внимание, что Memberhip.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."); 
    } 
Смежные вопросы