2010-02-23 10 views
5

मैं निम्नलिखित कोड है, जो रनटाइम के दौरान विफल रहता है ... हैमैं एएसपी.NET सर्वर वैरिएबल ["HTTP_HOST"] मान का नकल कैसे कर सकता हूं?

var mock = new Mock<ControllerContext>(); 
mock.SetupGet(x => x.HttpContext.Request 
    .ServerVariables["HTTP_HOST"]).Returns(domain); 

** RunTime Error: Invalid setup on non-overridable property

मैं अपने नियंत्रक, जो डोमेन उपयोगकर्ता का अनुरोध किया है/के लिए चले गए जाँच करने की जरूरत है में कुछ कोड मिल गया है।

मुझे यकीन नहीं है कि इसे कैसे नकल करना है? कोई विचार?

पीएस। मैं उपरोक्त उदाहरण में Moq फ्रेमवोक का उपयोग कर रहा हूं .. तो मुझे यकीन नहीं है कि यह कोई मुद्दा है, आदि?

उत्तर

6

आप इंडेक्सर को NameValueCollection पर नकल नहीं कर सकते क्योंकि यह वर्चुअल नहीं है। मैं क्या करूँगा सर्वरवारीबल्स संपत्ति का नकल है क्योंकि यह वर्चुअल है। आप अपना नाम ValueCollection भर सकते हैं। नीचे

यहाँ देखें मैं क्या कर सकता है:

var context = new Mock<ControllerContext>(); 
NameValueCollection variables = new NameValueCollection(); 
variables.Add("HTTP_HOST", "www.google.com"); 
context.Setup(c => c.HttpContext.Request.ServerVariables).Returns(variables); 
//This next line is just an example of executing the method 
var domain = context.Object.HttpContext.Request.ServerVariables["HTTP_HOST"]; 
Assert.AreEqual("www.google.com", domain); 
+0

एचए! बेशक!! <3 .. इसके अलावा, आपने 'context.Setup' का उपयोग किया था। मैं 'context.SetupGet' का उपयोग कर रहा था ... किसी भी कारण से आपने इसका इस्तेमाल क्यों किया? (मैं वास्तव में मक़ के लिए वास्तव में नया हूं ...) –

+0

शायद कुछ प्रकार का अंतर है, लेकिन मैं जटिलताओं पर भी एक विशेषज्ञ नहीं हूं इसलिए मैं स्थिरता के लिए बोर्ड में सेटअप() का उपयोग करता हूं :) यह पोस्ट लगता है मतभेदों को थोड़ा सा समझाने के लिए, हालांकि मैं इस पर एक विशेषज्ञ से भी खुशी से सुनूंगा: http://stackoverflow.com/questions/1073846/need-help-understand-moq-better – Eric

1

आप इंटरफेस के साथ HttpContext को कवर करने और अपने परीक्षण में यह नकली कर सकते हैं:

interface IHttpContextValues 
{ 
    string HttpHost { get; } 
} 

class HttpContextValues : IHttpContextValues 
{ 
    public string HttpHost 
    { 
     get { return HttpContext.Current.Request.ServerVariables["HTTP_HOST"]; } 
    } 
} 

class BaseController : Controller 
{ 
    public IHttpContextValues HttpContextValues; 
    BaseController() 
    { 
     HttpContextValues = new HttpContextValues(); 
    } 
} 

तो फिर तुम में ControllerContext.HttpContext के बजाय HttpContextValues ​​का उपयोग अपने नियंत्रक कोड। आपको मॉकिंग के बारे में कोई संयोजन नहीं करना है।

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