2010-08-06 13 views
8

HTML Yardımcımı test ederken bir sorunla karşılaştım. Temel olarak, satır, sütun ve farklı türde veri içeren bir ızgara oluşturuyorum. Başlıkta, kullanıcıya hangi verilere göre sıralandığını bildiren bir resim de vardır. Ben artık testi yazıyorum Ancak, (çok geç, ama ?! asla doğru daha geç), bu hata atılmış olsun:HtmlHelper'ı test ederken görüntü yolunda sorun nasıl giderilir?

"uygulama göreli sanal yol '~/Görüntüler/SortingArrowUp .png ' yapamaz, çünkü yoluna uygulama bilinmemektedir. "

var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png"); 

Bunu nasıl çözebiliriz. Bunun test sırasında nasıl bir sorun olabileceğini anlayabiliyorum ve görüntü mevcut olmayabilir ve tüm bunlar olabilir, ancak bunu yapmanın doğru yolu nedir?

cevap

13

VirtualPathUtility yerine UrlHelper.GenerateContentUrl numaralı telefonu aramak doğru yöntemdir. yardımcın kodunda böyle bir şey yapacağını:

MvcHtmlString MyHelper(this HtmlHelper helper, ...) { 
    // other code 
    var imgPath = UrlHelper.GenerateContentUrl("~/Images/SortingArrowUp.png", 
              helper.ViewContext.HttpContext); 
    // other code 
} 

birim testleri doğru alay bağlam nesneleri geçmek zorunda çıkacaktır. HttpContext.Request.ApplicationPath - sahte kukla uygulama yoluna geri dönmeniz gerekiyor, HttpContext.Response.ApplyAppPathModifier() - hiçbir şey yapmayın, HttpContext.Request.ServerVariables - dönüş null, HttpContext.Request.Path ve HttpContext.Request.RawUrl - anlamlı olan bazı değerler döndürün.

+0

Serin, Ne demek istediğini anlıyorum. Bunu kullanabilmem gerekirse şimdi yardımcılarıma büyük değişiklikler yapmalıyım ve bu aşamada bunu yapamam. Ama şimdi bunu gelecekte nasıl yapacağımı biliyorum. Cevap için teşekkürler. – MrW

+1

Yardımcım bir HttpContext özelliği içermiyor. Sınıfına erişimim var ve şu anki özelliğini (HttpContext.Current) çağırabilirim ama bu başarısız olur çünkü .GenerateContentUrl() bir HttpContextBase, bir HttpContext bekler çünkü ... burada çözüm nedir? – ekkis

+1

@ekkis Lütfen farklı bir durumunuz olduğu anlaşılan yeni bir soru başlatın. – marcind

5

Sadece bu aşırı kullanabilirsiniz:

var imgPath = VirtualPathUtility.ToAbsolute("~/Images/SortingArrowUp.png", 
    context.Request.ApplicationPath); 

Bu UrlHelper.GenerateContentUrl dahili kullanır ve sadece ApplicationPath alay etmeye ne ihtiyaç vardır.

+0

"Bağlam" ne anlama geliyor? – ekkis

+0

Geçerli HttpContext –

+0

evet, anladım. Bu mücadele etmekte olan diğer yoksul sods için, böyle bir bağlam alabilirsiniz: 'HttpContextBase currentContext = new HttpContextWrapper (HttpContext.Current);' Sen HtmlHelper gelen HttpContextBase bir örneğini alabilirsiniz – ekkis

İlgili konular