2010-02-23 7 views
5

tengo el siguiente código, que falla durante el tiempo de ejecución ...¿Cómo puedo simular el valor de ASP.NET ServerVariables ["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

Tengo algo de código en mi controlador, que tiene que comprobar el dominio ha solicitado/ido al usuario.

No estoy seguro de cómo simularlo? ¿algunas ideas?

PS. Estoy usando el marco de trabajo Moq en el ejemplo anterior ... ¿así que no estoy seguro de si eso es un problema, etc.?

Respuesta

6

No se puede simular el indexador en NameValueCollection porque no es virtual. Lo que haría sería burlarme de la propiedad ServerVariables ya que IS es virtual. Puede completar su propia NameValueCollection. Véase más abajo

Esto es lo que yo haría:

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! ¡¡Por supuesto!! <3 .. Además, usaste 'context.Setup'. Estaba usando 'context.SetupGet' ... ¿alguna razón por la que usaste eso? (Realmente soy nuevo para Moq ...) –

+0

Probablemente haya algún tipo de diferencia, pero tampoco soy un experto en las complejidades, así que uso Setup() en general para coherencia :) Esta publicación parece para explicar las diferencias un poco, aunque con mucho gusto escucharía de un experto en esto también: http://stackoverflow.com/questions/1073846/need-help-understand-moq-better – Eric

1

Puede cubrir HttpContext con interfaz y se burlan de él en sus pruebas:

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

continuación, utiliza HttpContextValues ​​en lugar de en su ControllerContext.HttpContext código de controlador. No tienes que hacer ninguna combinación sobre burlarse.

Cuestiones relacionadas