2012-02-13 14 views
12

मैं बहुत, बहुत इकाई परीक्षण करने के लिए नया हूँ और एक सुंदर सरल विधि के लिए एक परीक्षण लिखने के लिए कोशिश कर रहा हूँ:अनुरोध हेडर की जांच करने वाली विधि का परीक्षण करने के लिए मैं यूनिट परीक्षण कैसे कर सकता हूं?

public class myClass : RequireHttpsAttribute 
{ 
    public override void OnAuthorization(AuthoizationContext filterContext) 
    { 
     var request = filterContext.HttpContext.Request; 
     var header = Convert.ToBoolean(request.Headers["Special-Header-Name"]); 

     if (!(header || request.IsSecureConnection)) 
     { 
      HandleNonHttpsRequest(filterContext); 
     } 
    } 
} 

इस विधि है, जो RequireHttpsAttribute से विरासत, जांच करता है कि शीर्ष लेख एक पृष्ठ से मौजूद है , यदि यह गुम या गलत है, और पृष्ठ सुरक्षित नहीं है, तो यह HandleNonHttpsRequest पर कॉल करेगा, अन्यथा यह कुछ भी नहीं करता है।

हम परीक्षण के लिए मोक और नुनिट का उपयोग कर रहे हैं। मुझे Moq के साथ एक fakeHttpContext बनाने में सहायता के लिए कुछ संसाधन मिल गए हैं, लेकिन ईमानदारी से मुझे यकीन नहीं है कि इसका उपयोग कैसे करें या मेरे यूनिट परीक्षणों के भीतर कहां जाना है यह सुनिश्चित करने के लिए कि नकली HttpContexts HandleNonHttpsRequest कॉल करने की विधि नहीं दे रहे हैं।

मैं वास्तव में इस मुद्दे के साथ किसी भी मार्गदर्शन की सराहना करता हूं।

उत्तर

20
// arrange 
var context = new Mock<HttpContextBase>(); 
var request = new Mock<HttpRequestBase>(); 
var headers = new NameValueCollection 
{ 
    { "Special-Header-Name", "false" } 
}; 
request.Setup(x => x.Headers).Returns(headers); 
request.Setup(x => x.HttpMethod).Returns("GET"); 
request.Setup(x => x.Url).Returns(new Uri("http://www.example.com")); 
request.Setup(x => x.RawUrl).Returns("/home/index"); 
context.Setup(x => x.Request).Returns(request.Object); 
var controller = new Mock<ControllerBase>(); 

var actionDescriptor = new Mock<ActionDescriptor>(); 
var controllerContext = new ControllerContext(context.Object, new RouteData(), controller.Object); 
var filterContext = new AuthorizationContext(controllerContext, actionDescriptor.Object); 
var sut = new myClass(); 

// act 
sut.OnAuthorization(filterContext); 

// assert 
Assert.IsInstanceOfType(filterContext.Result, typeof(RedirectResult)); 
var redirectResult = (RedirectResult)filterContext.Result; 
Assert.AreEqual("https://www.example.com/home/index", redirectResult.Url); 
+1

+1 परीक्षण के एएए अनुभागों को इंगित करते हुए। – CodingWithSpike

+0

धन्यवाद! इसने मुझे कुछ सफल परीक्षण प्राप्त करने के लिए सही दिशा में भेजा। – Dredj

1

हां, मैं Moq का उपयोग करता हूं और Mock<AuthorizationContext> बना देता हूं। फर्जी अनुरोध स्थापित करने के लिए आपको नकली ऑब्जेक्ट्स की एक श्रृंखला की आवश्यकता होगी, विशेष रूप से फर्जी हेडर के नामवैल्यू कोलेक्शन को निर्दिष्ट करने के लिए।

var request = new Mock<HttpRequestBase>(); 
request.SetupGet(c => c.Headers).Return(new NameValueCollection{ /* initialize values here */}); 
request.SetupGet(c => c.IsSecureConnection).Return(/*specify true or false depending on your test */); 

var httpContext = new Mock<HttpContextBase>(); 
httpContext.SetupGet(c => c.Request).Return(request.Object); 


var filterContext = new Mock<AuthorizationContext>(); 
filterContext.SetupGet(c => c.HttpContext).Return(httpContext.Object); 

var myclass = new myClass(); 
myClass.OnAuthorization(filterContext.Object); 

(खेद है वाक्य रचना या उपयोग से थोड़ा दूर है, मेरे सिर के ऊपर से यह कर)

आप में जाने के लिए और filterContext पर किसी भी अतिरिक्त सदस्यों नकली कि HandleNonHttpsRequest का आह्वान करना पड़ सकता है। इसके बारे में जाने के लिए मेरे पास दो अनुशंसाएं हैं, क्योंकि कभी-कभी परेशानी हो सकती है यदि आप जिस विधि का परीक्षण कर रहे हैं वह फ़िल्टर पर बहुत जटिल चीजें कर रहा है। कॉन्टैक्ट: 1) दृष्टि से जांचें और, यदि यह सीधे आगे है, तो सभी आवंटित टुकड़ों का मज़ाक उड़ाएं 2) myClass.OnAuthorizationRequest बनाएं, लेकिन HandleNonHttpsRequest को कॉल के अलावा अभी तक किसी भी कोड को लागू न करें। टेस्ट पास होने तक परीक्षण चलाने और गायब/ग़लत रूप से मॉक किए गए सदस्यों को ठीक करने के लिए जारी रखें। फिर जब तक यह गुजरता है, ऑनऑनराइजेशन रिक्वेस्ट, परीक्षण और फिक्सिंग (दोहराना कुल्ला) के लिए अपने वास्तविक तर्क को लागू करें।

0

मैं ASP.NET MVC 4. का उपयोग कर इसे हल करने के लिए the accepted solution के साथ एक समस्या का सामना करना पड़ा मेरी नक़ल http संदर्भ आइटम विशेषता अन्यथा sut.OnAuthorization पैदा कर रहा था एक वस्तु अपरिभाषित अपवाद है: के लिए

MockHttpContext.Setup(x => x.Items) 
    .Returns(new System.Collections.Generic.Dictionary<object, object>()); 
संबंधित मुद्दे

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