嘲弄会员资格

Rob*_*thy 9 tdd asp.net-membership mocking

我正在编写自定义配置文件提供程序,但我仍打算使用默认的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   }
Run Code Online (Sandbox Code Playgroud)

如何模拟Membership.GetUser()调用以便我可以为此方法编写测试?有什么建议或例子吗?谢谢.

sjo*_*urg 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);
    }       
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*ray 4

您能否将一个MembershipProvider实例注入到您的配置文件提供程序中,如果没有注入,则重新使用Membership.Provider

public MembershipProvider MembershipProvider
{
    get { return _membershipProvider ?? Membership.Provider; }
    set { _membershipProvider = value; }
}
Run Code Online (Sandbox Code Playgroud)

您的个人资料提供程序将通过此属性返回的值与会员资格提供程序进行交互。在您的测试中,您将注入假/模拟MembershipProvider实例。

如果您只想模拟 Membership 上的静态方法,我猜您将不得不使用类似TypeMock的东西。