2010-02-23 6 views
5

Ich habe den folgenden Code, der während der Laufzeit nicht ...Wie kann ich den Wert von ASP.NET ServerVariables ["HTTP_HOST"] verspotten?

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

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

Ich habe einige Code in meinem Controller bekam, die die Domäne der Benutzer überprüfen muss angefordert/gegangen.

Ich bin mir nicht sicher, wie man es mockt? irgendwelche Ideen?

PS. Ich benutze den Moq framewoke im obigen Beispiel .. also bin ich mir nicht sicher ob das ein Problem ist, etc.?

Antwort

6

Sie können den Indexer für eine NameValueCollection nicht verspotten, da sie nicht virtuell ist. Was ich tun würde, ist die ServerVariables-Eigenschaft zu verspotten, da diese virtuell ist. Sie können Ihre eigene NameValueCollection ausfüllen. Siehe unten

Hier ist, was ich tun würde:

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

HA! Na sicher!! <3 .. Sie haben auch 'context.Setup' verwendet. Ich habe 'context.SetupGet' benutzt ... irgendeinen Grund, warum du das benutzt hast? (Ich bin wirklich sehr neu in Moq ...) –

+0

Es gibt wahrscheinlich eine Art von Unterschied, aber ich bin auch kein Experte für die Feinheiten, so verwende ich einfach Setup() auf der ganzen Linie für Konsistenz :) Dieser Beitrag scheint um die Unterschiede ein wenig zu erklären, obwohl ich gerne von einem Experten dazu auch hören würde: http://stackoverflow.com/questions/1073846/need-help-understand-moq-besser – Eric

1

Sie decken können Httpcontext mit Schnittstelle und verspotten sie in Ihren Tests:

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(); 
    } 
} 

Dann nutzen Sie HttpContextValues ​​statt ControllerContext.HttpContext in Ihrem Controller-Code. Sie müssen keine Kombinationen über Spott machen.