2009-06-08 15 views
9

私はカスタムプロファイルプロバイダを作成していますが、私はまだ、メンバーシッププロバイダとしてデフォルトのAspNetSqlMembershipProviderを使用するつもりです。私のプロフィールプロバイダでの私のGetAllProfiles()メソッドは次のようになります。Mocking Membership

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や部品番号を使用して考えていたが、私は、この特定のシナリオのいずれかの例を見ていません。私は、あなたがその仕組みがどのように見えるかを示唆しているように、注射して遊んでいきます。ありがとう。 –

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