2009-06-12 5 views
28

Próbuję przetestować niektóre logiki aplikacji, które są zależne od właściwości Values ​​w ControllerContext.RouteData.Szydzenie klasy RouteData w System.Web.Routing dla aplikacji MVC

tej pory mam

// 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); 

Jednostka test nie powiedzie się z: System.ArgumentException: Nieprawidłowe ustawienie na nie przeciążać członka: r => r.Values ​​

Tworzenie fałszywych RouteData nie działa tak jak konstruktor to RouteData (RouteBase, IRouteHandler).

Ważną klasą jest tutaj klasa abstrakcyjna RouteBase, która ma metodę GetRouteData (HttpContextBase), która zwraca wystąpienie RouteData, klasy, którą próbuję sfałszować. Zabieranie mnie w kółko!

Każda pomoc w tym zakresie byłaby bardzo pożądana.

Odpowiedz

54

RouteData ma również constructor that takes no arguments. Po prostu utwórz jedną i dodaj do niej żądane wartości. Nie ma potrzeby drwić z niego, gdy można go stworzyć.

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

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

Lol, dziękuję. To był przypadek przemyślenia problemu z mojej strony. Bardzo prosta. Twoje zdrowie. – Magpie

2

Jestem bardzo nowe do TDD w połączeniu z makiety obiektów, ale lekcja dowiedziałem się na początku z kolega nie było wyśmiewać rodzaju nie należą do Ciebie. Dlatego nie próbuj kpić z RouteData. Pomysł został pierwotnie opracowany przez Joe Walnes (choć nie mogę znaleźć, gdzie on to powiedział).

+2

W rzeczywistości jednym z powodów, dla których Microsoft opracował HttpContextBase, było to, że można go wyśmiać. To bardzo skomplikowany obiekt, ale często używany w testach sieciowych. Istnieje kilka doskonałych przykładów użycia Moq do przetestowania twoich tras w Pro ASP.NET MVC Stevena Sandersona 2. – KarlZ

+0

Więc jak mam sprawdzać moich pomocników, które zależą od rzeczy takich jak RouteData ... Jeśli mówisz, że nie powinienem próbować klasy, których nie posiadam? Nie można wtedy pisać testów, a może sposobu, w jaki klasa, którą testuję, musi być bardziej abstrakcyjna? Nie mogę już zawracać sobie głowy zmianą mojej klasy ... działa tylko potrzebuję testów jednostkowych, aby to udowodnić: D – ppumkin