35

ControllerContext.RouteData の Values プロパティに依存するいくつかのアプリケーション ロジックをテストしようとしています。

これまでのところ、

// 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: Invalid setup on a non-overridable member: r => r.Values

コンストラクターが RouteData(RouteBase,IRouteHandler) であるため、偽の RouteData を作成しても機能しません。

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

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

4

2 に答える 2

1

私はモック オブジェクトと組み合わせて TDD を使用するのは初めてですが、早い段階で同僚から学んだ教訓は、所有していない型をモックしないことでした。したがって、RouteData をモックしようとしないでください。このアイデアはもともとJoe Walnesによって考案されました(ただし、彼がどこで言ったのかはわかりません)。

于 2009-06-12T12:23:03.117 に答える