2009-06-12 10 views
28

ControllerContext.RouteDataのValuesプロパティに依存するアプリケーションロジックをテストしようとしています。MVCアプリケーションのSystem.Web.RoutingのRouteDataクラスの模擬

これまでのところ、私はユニットテストが失敗したと

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

を持っている: System.ArgumentExceptionの:非オーバーライドメンバーに無効な設定: R => r.Values

が偽のRouteDataの作成コンストラクタがRouteData(RouteBase、IRouteHandler)のいずれかとして動作しません。

ここで重要なクラスは、RouteDataのインスタンスを返すGetRouteData(HttpContextBase)メソッドを持つ抽象クラスRouteBaseです。このクラスは私が偽造しようとしているクラスです。サークルで私を連れて行こう!

これに関するヘルプは、大歓迎です。

答えて

54

RouteDataにはconstructor that takes no argumentsも含まれます。単に1つを作成し、それに必要な値を追加します。あなたがそれを作成できるときにそれを嘲笑する必要はありません。

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

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

笑、ありがとう。これは、私のところで問題を考える上でのケースでした。非常に簡単です。乾杯。 – Magpie

2

私はモックオブジェクトと一緒にTDDに非常に新しいですが、私は同僚から早い段階で学んだ教訓は、あなたが所有していないタイプを模擬することはなかったです。したがって、RouteDataをモックしようとしないでください。アイデアはもともとJoe Walnes(私は彼がそれを言った場所を見つけることができません)で構想されました。

+2

実際に、MicrosoftがHttpContextBaseを開発した理由の1つは、あなたがそれを嘲笑できるようなものでした。これは非常に複雑なオブジェクトですが、Webテストで頻繁に使用されます。 Steven SandersonのPro ASP.NET MVC 2でMoqを使用してルートをテストする優れた例がいくつかあります。 – KarlZ

+0

RouteDataなどのようなものに依存するヘルパーをテストするのはどうですか?私が模擬するとは思わないクラス私は自分自身をしないでください?テストを書くことはできませんし、おそらく私がテストしているクラスをより抽象的にする必要がありますか?私のクラスを今変更することで気にすることはできません..それは動作します私はそれをprooveするために単体テストが必要です:D – ppumkin

関連する問題