2010-02-23 15 views
5

i çalışma zamanı sırasında başarısız aşağıdaki kodu, ... sahip ASP.NET ServerVariables ["HTTP_HOST"] değerine nasıl dalga geçebilirim?

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

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

Ben kullanıcı gitmiş/talep etmiştir etki alanını kontrol etmek gerekiyor benim denetleyicisi, bazı kod var

.

Nasıl alay edeceğime emin değilim? herhangi bir fikir?

PS. Yukarıdaki örnekte Moq framewoke kullanıyorum .. bu yüzden bir sorun, vb emin değilim?

cevap

6

Dizin oluşturucu, sanal olmadığı için bir NameValueCollection üzerinde alamıyorsunuz. Yaptığım şey, bu sanal sanal sunucudan beri ServerVariables özelliği ile dalga geçmek. Kendi NameValueCollection öğenizi doldurabilirsiniz. İşte

aşağıya bakın ben böyle yapardım:

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! Tabii ki!! <3 .. Ayrıca, 'context.Setup' kullandınız. 'Context.SetupGet' kullanıyordum ... bunu neden kullanabildin? (Ben gerçekten Moq için gerçekten yeni ...) –

+0

Muhtemelen bir çeşit farklılık var, ama aynı zamanda ben bu konuda bir uzman değilim, bu yüzden tutarlılık için kurul() boyunca sadece kurulum() kullanın :) Bu yazı gibi görünüyor Bu konuda bir uzmandan memnuniyet duyabilsem de, farkları biraz açıklamak için: http://stackoverflow.com/questions/1073846/need-help-understand-moq-better – Eric

1

Sen arayüzü ile HttpContext kapsayacak ve testlerde bunu alay: Ardından

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

sen yerine ControllerContext.HttpContext arasında HttpContextValues ​​kullanmak senin denetleyici kodu. Alayla ilgili herhangi bir kombinasyon yapmak zorunda değilsiniz.

İlgili konular