2012-09-13 7 views
9

मैं यह जांचने के लिए एक विधि का परीक्षण करना चाहता हूं कि यह एक लेनदेन को सही तरीके से बचाता है। इसके अंदर सदस्य.GetUser() को उपयोगकर्ता को सत्यापित करने के लिए कॉल करता है जो हर बार परीक्षण विफल होने का कारण बनता है। क्या इसका मजाक करने का कोई तरीका है ताकि सदस्यता.GetUser() हमेशा वैध नाम देता है?यूनिट परीक्षण विधियों को कैसे करें जो System.Web.Security.Membership का उपयोग करते हैं?

मैं Moq, C# और ASP.Net 4.5 MVC

उत्तर

5

उपयोग कर रहा हूँ संक्षेप में, आप नहीं कर सकते। यही कारण है कि ऐसी "सेवा" के लिए हर कॉल को एक अमूर्तता के पीछे छुपाया जाना चाहिए।

आप डिफ़ॉल्ट एमवीसी टेम्पलेट में इसका नमूना देख सकते हैं।

+1

क्या आप विस्तृत कर सकते हैं? टेम्पलेट WebSecurity.Login() का उपयोग करता है। अमूर्त करने का एक अच्छा तरीका क्या है कि यूनिट परीक्षण वास्तव में डेटाबेस को हिट नहीं करते? – GWTF

+2

यह पाया गया जो आशाजनक लग रहा है: http://blog.spontaneouspublicity.com/unit-testing-the-mvc4-account-controller। क्या आप इस तरह के अमूर्तता के बारे में बात कर रहे हैं? – GWTF

+0

@ स्कॉट लिंक टूटा हुआ। –

3

हां, जैसे सर्ग ने कहा, आप इसे लागू करने के लिए वास्तविक सेवा के लिए एक इंटरफेस प्रदान करके इसे नकल कर सकते हैं। इस इंटरफेस जैसे सार्वजनिक तरीकों आप बुला रहे हैं, होगा:

public interface IMyServiceInterface 
{ 
    IMembershipUser GetUser(); 
    // other methods you want to use... 
} 

अपने इकाई परीक्षण में, आप कह सकते हैं कि:

var mockService = new Mock<IServiceInterface>(); 
mockService.Setup(mock => mock.GetUser()). 
    Returns(new MembershipUserImplementation("MyTestUser", otherCtorParams)); 

मेरे उदाहरण में मैं के साथ-साथ MembershipUser के लिए एक आवरण बन जाएगा ऐसा लगता है कि इसे एक अमूर्तता के पीछे भी होना चाहिए।

+0

उदाहरण में आप किस मॉकिंग फ्रेमवर्क का उपयोग कर रहे हैं? –

+0

मैं [Moq] (http://code.google.com/p/moq/) का उपयोग करता हूं। यह आसान है और मुझे वह सब कुछ करने की ज़रूरत है जो मुझे करने की ज़रूरत है। – sfogle

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