2009-06-08 7 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 उदाहरण इंजेक्ट करेंगे।

यदि आप बजाय सदस्यता पर स्थिर विधियों का नकल करना चाहते हैं, तो आपको टाइपमैक जैसे कुछ का उपयोग करना होगा, मुझे लगता है।

+0

हाँ, मैं TypeMock या Moq उपयोग करने के बारे में सोच रहा था, लेकिन मैं इस विशेष परिदृश्य के लिए किसी भी उदाहरण नहीं देखा है। मैं एक इंजेक्शन के साथ खेलूँगा जैसा कि आपने यह देखने के लिए सुझाव दिया कि यह कैसे काम करता है। धन्यवाद। –

6

मैं इस समस्या में भी चल रहा हूँ

समस्या तथ्य यह है कि विधि GetUser() पैरामीटर के बिना वर्ग पर एक स्थिर पद्धति के रूप में कार्यान्वित किया जाता है में निहित है।

जबकि सदस्यता। प्रदाता (जब मॉक किया गया) में पैरामीटर के बिना 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 में सदस्यता कार्यक्षमता encapsulating द्वारा इस हल किया। जो (उदाहरण के लिए: इंजेक्शन के माध्यम से) आप आसानी से अपने परीक्षणों में नकली कर सकते हैं।

मॉकिंग सेवाओं का एक उदाहरण ... 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."); 
    }