2009-06-12 12 views
28

ControllerContext.RouteData'daki Values ​​özelliğine bağlı olan bazı uygulama mantığını test etmeye çalışıyorum. System.ArgumentException: olmayan bir geçersiz kılınabilir üyesinde Geçersiz ayarı: r => r.Values ​​System.Web'deki RouteData Sınıfını Alıkoyma MVC uygulamaları için yeniden başlatma

sahte RouteData oluşturma

Şimdiye kadar

// Arrange 
var httpContextMock = new Mock<HttpContextBase>(MockBehavior.Loose); 
var controllerMock = new Mock<ControllerBase>(MockBehavior.Loose); 
var routeDataMock = new Mock<RouteData>(); 

var wantedRouteValues = new Dictionary<string, string>(); 
wantedRouteValues.Add("key1", "value1"); 
var routeValues = new RouteValueDictionary(wantedRouteValues); 

routeDataMock.SetupGet(r => r.Values).Returns(routeValues); <=== Fails here 

var controllerContext = new ControllerContext(httpContextMock.Object, routeDataMock.Object, controllerMock.Object); 

testi ile başarısız birim var Yapıcı RouteData (RouteBase, IRouteHandler) olduğu gibi çalışmıyor.

Burada önemli sınıf, RouteData'nın bir örneğini döndüren GetRouteData (HttpContextBase) yöntemine sahip olan ve sınıfını sahte yapmaya çalıştığım sınıf olan RouteBase sınıfıdır. Beni çevrelerde gezdirmek!

Bu konuda herhangi bir yardım gelebilir.

cevap

54

RouteData ayrıca bir constructor that takes no arguments sahiptir. Basitçe bir tane oluşturun ve istediğiniz değerlere ekleyin. Bir tane oluşturabildiğinizde alamaya gerek yok.

var routeData = new RouteData(); 
routeData.Values.Add("key1", "value1"); 

var controllerContext = new ControllerContext(httpContextMock.Object, routeData, controllerMock.Object); 
+0

Lol, teşekkürler. Bu benim üzerimde problemi düşünmek üzerine bir durumdu. Çok basit. Şerefe. – Magpie

2

Ben sahte nesnelerle birlikte TDD çok yeniyim ama bir meslektaşım sahibi olmayan türleri alay etmek değildi bir ders erken öğrendim. Böylece, RouteData ile dalga geçme. Bu fikir ilk olarak Joe Walnes tarafından tasarlandı (yine de nerede olduğunu bulamadım).

+2

Aslında Microsoft, HttpContextBase'i geliştirmesinin nedenlerinden biriydi ve bu yüzden alay edebileceksiniz. Bu çok karmaşık bir nesnedir, ancak sıklıkla web testinde kullanılır. Eğer rotaları test etmek için Moq kullanarak bazı mükemmel örnekleri vardır: Steven Sanderson'ın Pro ASP.NET MVC 2. – KarlZ

+0

Peki nasıl RouteData gibi şeylere bağlı yardımcılarımı test etmek istiyorum. Eğer alay etmemem gerekiyorsa sahip olmadığım dersler Testler yazılamıyor ya da muhtemelen test ettiğim sınıfın daha soyut olması gerekiyor mu? Şimdi sınıfımı değiştirmekle uğraşmak zorunda kalmıyorum. İşe yaramak için sadece birim testlere ihtiyacım var: D – ppumkin

İlgili konular