2009-09-02 8 views
21

ASP.NET MVCアプリケーションのメニュー用のURLは、コントローラ/アクションから生成されます。だから、彼らは電話するASP.NET MVC:モックコントローラ.Url.Action

controller.Url.Action(action, controller) 

今、私は単体テストでこの作品を作るのですか? は私が

var controller = new TestControllerBuilder().CreateController<OrdersController>(); 

で正常MVCContribを使用するが、私はcontroller.Url.Action(アクション、コントローラは)URL == nullであるためとNullReferenceExceptionで失敗し得るものは何でも、私はそれをやってみてください。

更新:HttpContextを傍受する方法ではありません。私は、MVCContrib、Scott Hanselmanの偽造の例、そしてhttp://stephenwalther.com/blog/archive/2008/07/01/asp-net-mvc-tip-12-faking-the-controller-context.aspxからのものを使用して、いくつかの方法でこれを行いました。これは、私が偽の値を知る必要があるので、私を助けません...それはApplicationPathですか?どうすれば設定できますか?呼び出されたコントローラ/アクションと一致する必要がありますか?つまり、Url.Actionはどのように動作し、どのようにそれを満足させるのですか?

また、私はIUrlActionAbstractionを実行してそのことを知ることができると知っています...しかし、私はこれをやりたいとは思っていません。結局のところ、私はMVCContrib/Mockフルパワーを持っています。なぜ別の抽象化が必要なのでしょうか?

+0

テストスイートは何ですか? –

+1

それだけで答えは価値がないので、私は同様の答えを指します:http://bit.ly/aSJ0a –

+0

はい私はそのリンクを使用し、それは動作しませんでした。実際に私はScottのバージョンとMVCContribの両方を試しました。私が理解しようとしていることは、どのような値を設定する必要があるかです。 Url.Action()は実際に何を使用していますか?私。あなたが提供したリンクには、多くの変数を設定するMoqのバージョンがあります...それらのすべてが必要ですか?私は運がなければそれらのすべてを試しました。 – queen3

答えて

21

ここでは、MvcContribのTestControllerBuilderを使用してUrlHelperモックができる方法です:

var routes = new RouteCollection(); 
MvcApplication.RegisterRoutes(routes); 
HomeController controller = CreateController<HomeController>(); 

controller.HttpContext.Response 
    .Stub(x => x.ApplyAppPathModifier("/Home/About")) 
    .Return("/Home/About"); 

controller.Url = new UrlHelper(
    new RequestContext(
     controller.HttpContext, new RouteData() 
    ), 
    routes 
); 
var url = controller.Url.Action("About", "Home"); 
Assert.IsFalse(string.IsNullOrEmpty(url)); 
+0

おっと... MSDNのヘルプでController.Urlを表示するのが誤解を招いていました。「URLヘルパーオブジェクトを取得します」...セッターがあるかどうか確認していませんでした。 – queen3

+0

MVC4 Darinでこれを達成する方法を知っていますか?私はあなたのコード例に従っていますが、RegisterRoutesを呼び出すことはできません – DevDave

+2

タイラー:RegisterRoutesは規約であり、MvcApplication.RouteTable.Routes.Add(...)を使用してください。 – Shane

3

それが簡単にうまく動作フェイク:

var fakeUrlHelper = A.Fake<UrlHelper>(); 
     controller.Url = fakeUrlHelper; 
     A.CallTo(() => fakeUrlHelper.Action(A<string>.Ignored, A<string>.Ignored)) 
      .Returns("/Action/Controller"); 
+0

「FakeItEasy」を使用するために+1 bazillion!しかし、...「アクション」メソッドは仮想ではありません...だから、どうやってそれを偽造するのですか? –

3

あなたはMoq(とないMvcContribTestControllerBuilder)を使用している場合は、 @ DarianDimitrovの答えに似た文脈を模倣することができます:

var controller = new OrdersController(); 
var context = new Mock<System.Web.HttpContextBase>().Object; 

controller.Url = new UrlHelper(
    new RequestContext(context, new RouteData()), 
    new RouteCollection() 
); 

これはcontroller.HttpContextプロパティを設定しませんが、Url.Actionを実行できます(空の文字列を返します)。これを行うには

13

きれいな方法は、単にモックUrlHelper自体

​​

クリーンでシンプルに部品番号(またはあなたが好きな他のフレームワーク)を使用しています。

関連する問題