2010-11-23 34 views
9

मैं वर्तमान में एक एएसपीएनटी एमवीसी 2 एप्लीकेशन विकसित कर रहा हूं जो प्रमाणीकरण के लिए डिफ़ॉल्ट SqlMembershipProvider का उपयोग करता है। मैंने एक नियंत्रक विधि लागू की है जो Membership.GetUser().ProviderUserKey पर कॉल करके वर्तमान उपयोगकर्ता के ProviderUserKey को पढ़ती है। अब मैं इस नियंत्रक के लिए कुछ परीक्षण विधियों को लिखने की कोशिश कर रहा हूं।एक सदस्यता उपयोगकर्ता मकरिंग

स्थिर सदस्यता वर्ग पर dependancy से छुटकारा पाने के लिए, मैं एक पतली आवरण बनाया है और बनाया मेरे नियंत्रक इसी इंटरफेस पर निर्भर है:

public interface IStaticMembershipService { 
    MembershipUser GetUser(); 

    void UpdateUser(MembershipUser user); 
} 

अब तक सब कुछ काम करता है, लेकिन यूनिट के क्रम में - नियंत्रक को जांचें, मुझे अभी भी इस इंटरफ़ेस की GetUser() विधि का नकल करने की आवश्यकता है और एक सदस्यताकर्ता उपयोगकर्ता ऑब्जेक्ट वापस करें जिसमें ProviderUserKey प्रॉपर्टी है। ऐसी वस्तु का नकल करने का सबसे आसान तरीका क्या है?

मैं moq फ्रेमवर्क के रूप में moq का उपयोग कर रहा हूँ।

उत्तर

11

यह कुछ इस तरह दिखाई चाहते हैं:

var membershipMock = new Mock<IStaticMembershipService>(); 
var userMock = new Mock<MembershipUser>(); 
userMock.Setup(u => u.ProviderUserKey).Returns(guid); 
membershipMock.Setup(s => s.GetUser()).Returns(userMock.Object); 

MembershipUser वर्ग मजाक (यानी करने के लिए खुद को उधार नहीं करता है, तो ProviderUserKey आभासी नहीं है), आप सदस्यता ऑर्डर ऑब्जेक्ट से आवश्यक मूल्यों का प्रतिनिधित्व करने के लिए अपनी खुद की ऑब्जेक्ट बनाना चाहेंगे, और आपकी सेवा इसके बजाय उनमें से एक को वापस कर देगी।

वहाँ भी है कि एक MembershipUser एक पोको जैसी वस्तु है एक मामूली संभावना है, और आप इस तरह एक उदाहरण बना सकते हैं:

var userMock = new MembershipUser {ProviderUserKey = guid}; 
+0

बहुत धन्यवाद, सदस्यता यूज़र-क्लास का एक नकल बनाना बहुत अच्छा काम करता है। – Simon

1

कुछ इस के समान:

var user = new MembershipUser(); 
var membershipService = new Mock<IStaticMembershipService>(); 
membershipService.Setup(p => p.GetUser()).Returns(user); 
2

मुझे लगता है कि आप उपभोक्ता वास्तव में इंटरफ़ेस से अपने कार्यान्वयन बारीकियों को अलग करने की जरूरत है की परवाह करता है। मुझे यकीन नहीं है कि आपके नियंत्रण को ProviderUserKey की आवश्यकता है, अगर यह किसी विशिष्ट वर्ग आदि को कास्टिंग कर रहा है, लेकिन मैं आपके इंटरफ़ेस को वास्तव में नियंत्रक की ज़रूरतों को पूरा करने के लिए देखता हूं, न कि दूसरी तरफ। की तरह (अधिक जानकारी जानने के बिना) कुछ:

public interface IMembershipDetailsService { 
    Guid UserKey { get; } 
} 

एक बार जब आप अमूर्त के उस स्तर करते हैं, तो मजाक बहुत आसान हो जाता है, क्योंकि आप बस कर सकता है:

membershipService.Setup (svc => svc.UserKey).Returns (myGuid); 

बस एक और सोचा, बजाय कोशिश कर एक संपूर्ण सदस्यता यूज़र ऑब्जेक्ट को वापस करने के लिए आपको आगे बढ़ने की आवश्यकता है।

+0

+1 बहुत अच्छा बिंदु। – StriplingWarrior

0

क्या आप नीचे कुछ ऐसा कर सकते हैं यदि आपको HttpContext सामान को भी मॉक करने की आवश्यकता है .. नीचे NUnit और Moq का उपयोग कर रहा है।

[SetUp] 
private void Setup() 
{ 
    _mockHttpContext = new Mock<HttpContextBase>(); 
    _mockStaticMembership = new Mock<IStaticMembershipService>();   
    _mockUser = new Mock<MembershipUser>(); 
    _mockPrincipalUser = new Mock<IPrincipal>();   

    _mockHttpContext.Setup(http => http.User).Returns(_mockPrincipalUser.Object); 
    _mockPrincipalUser.Setup(principal => principal.Identity.Name).Returns("myname"); 
    _mockUser.Setup(user => user.ProviderUserKey).Returns(Guid.NewGuid()); 

    _mockStaticMembership.Setup(membership => membership.GetUser(It.IsAny<string>())).Returns(_mockUser.Object); 

} 

[Test] 
public void Some_Test_For_My_Controller() 
{    
    var controller = new MyController(_mockStaticMembership.Object);    
    controller.ControllerContext = new ControllerContext(_mockHttpContext.Object, new RouteData(), controller); 

    //Test your action and verify 
} 
संबंधित मुद्दे

 संबंधित मुद्दे