Насмешливое членство - PullRequest
9 голосов
/ 09 июня 2009

Я пишу пользовательский провайдер профиля, но все же намереваюсь использовать 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 (), чтобы я мог писать тесты для этого метода? Есть предложения или примеры? Благодарю.

Ответы [ 3 ]

6 голосов
/ 03 августа 2009

Я тоже сталкиваюсь с этой проблемой

Проблема заключается в том, что метод 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);
    }       
}
4 голосов
/ 09 июня 2009

Не могли бы вы внедрить экземпляр MembershipProvider в ваш провайдер профиля и, если ни один из них не внедрен, использовать Membership.Provider?

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

Ваш поставщик профиля будет взаимодействовать с поставщиком членства через значение, возвращаемое этим свойством. В вашем тесте вы добавили бы поддельный / mock MembershipProvider экземпляр.

Если вы вместо этого хотите просто высмеивать статические методы для Членства, вам придется использовать что-то вроде TypeMock , я думаю.

1 голос
/ 03 августа 2009

В 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.");
    }
...