2009-07-09 10 views
26

मैं एक एमवीसी नियंत्रक कार्रवाई के लिए यूनिट-टेस्ट (सी # में) लिखना चाहता हूं जो अनुरोध को प्रमाणीकृत किया गया है या नहीं, इस पर निर्भर करता है कि एक दृश्य या दूसरा वापस आ सकता है। यह कैसे किया जा सकता है?एक एमवीसी नियंत्रक कार्रवाई इकाई-परीक्षण कैसे करें जो सी # में प्रमाणीकरण पर निर्भर करता है?

उत्तर

31

आप अपना अनुरोध नकल कर सकते हैं। इस (Moq का प्रयोग करके) की तरह कुछ:

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(x => x.IsAuthenticated).Returns(true); // or false 

var context = new Mock<HttpContextBase>(); 
context.SetupGet(x => x.Request).Returns(request.Object); 

var controller = new YourController(); 
controller.ControllerContext = 
     new ControllerContext(context.Object, new RouteData(), controller); 

// test 

ViewResult viewResult = (ViewResult)controller.SomeAction(); 

Assert.True(viewResult.ViewName == "ViewForAuthenticatedRequest"); 
+0

साफ। आपके उत्तर के लिए धन्यवाद। ;) – Mats

+0

यह मेरे लिए काम नहीं करता है - आपके उत्तर के लिए सच/झूठी – Kev

14

मजाक और निर्भरता इंजेक्शन का उपयोग करना। निम्नलिखित मानते हैं कि आप जांच रहे हैं कि यह प्रमाणीकृत है और फिर उपयोगकर्ता की आईडी प्राप्त करने के लिए उपयोगकर्ता ऑब्जेक्ट तक पहुंच रहा है। RhinoMocks का उपयोग करता है।

// mock context variables 
var username = "user"; 
var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
var request = MockRepository.GenerateMock<HttpRequestBase>(); 
var identity = MockRepository.GenerateMock<IIdentity>(); 
var principal = MockRepository.GenerateMock<IPrincipal>(); 

httpContext.Expect(c => c.Request).Return(request).Repeat.AtLeastOnce(); 
request.Expect(r => r.IsAuthenticated).Return(true).Repeat.AtLeastOnce(); 
httpContext.Expect(c => c.User).Return(principal).Repeat.AtLeastOnce(); 
principal.Expect(p => p.Identity).Return(identity).Repeat.AtLeastOnce(); 
identity.Expect(i => i.Name).Return(username).Repeat.AtLeastOnce(); 

var controller = new MyController(); 
// inject context 
controller.ControllerContext = new ControllerContext(httpContext, 
                 new RouteData(), 
                 controller); 

var result = controller.MyAction() as ViewResult; 

Assert.IsNotNull(result); 

// verify that expectations were met 
identity.VerifyAllExpectations(); 
principal.VerifyAllExpectations(); 
request.VerifyAllExpectations(); 
httpContext.VerifyAllExpectations(); 
+1

धन्यवाद के बिना एक ही दृश्यनाम देता है जो मुझे यकीन है कि मैं उत्कृष्टता से काम कर रहा हूं। चूंकि मैंने यू-जी-एन उत्तर का परीक्षण किया है (जो मेरे लिए ठीक काम करता है) और वह प्रतिक्रिया के साथ थोड़ा तेज था, मैंने उसका जवाब चिह्नित किया। कोई अपराध नहीं। आपका दिन शुभ हो। ;) – Mats

+1

कोई समस्या नहीं है। यह वास्तव में एक ही जवाब है। मैंने केवल मेरा छोड़ा क्योंकि यह दिखाता है कि अगर आपको उपयोगकर्ता नाम प्राप्त करने की आवश्यकता है या प्रिंसिपल पर IsInRole विधि, जो मैंने नहीं दिखाया है तो प्रिंसिपल/पहचान का नकल कैसे करें। – tvanfosson

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