2011-12-29 7 views
1

...しかし、アプリケーション自体が実行されているときには同じ拡張メソッドが機能します。 UrlHelper拡張メソッド自体は、次のようになります。ユニットテストでUrlHelper拡張メソッドを起動すると、ルート名に基づくルートが常に一致しません

 context.MapRoute(
      "Category", 
      "category/{seoCategoryName}", 
      new { area = "SoAndSo", controller = "SoAndSo", action = "Category", seoCategoryName = string.Empty } 
     ); 

...と私はその登録にブレークポイントを落としていることを確認するために:

public static string CategoryLandingPage(this UrlHelper helper, string seoCategoryName) 
    { 
     return helper.RouteUrl("Category", new { area = "SoAndSo", controller = "SoAndSo", action = "Category", seoCategoryName = seoCategoryName }, "http"); 
    } 

は私SoAndSoAreaRegistrationクラスでは、このような特定のルートがあることに登録しますそれはテストランナーに当たってしまいます。

私はテストを実行すると、 "ルート名に 'Category'という名前のルートが見つかりませんでした。

私がここで行っているように、ルート名を指定する必要はありません。ルートを完全に構築するには十分なルートパラメータ(エリア/コントローラ/アクション/カテゴリ名)ですが、テスト中に経路名が消えてしまう場所を特定しません。カテゴリ名を削除すると例外がなくなり、テストをパスすることができますが、テスト中にルート名がどこに消えているかはわかります。これはまだのようなコードを簡素化することは、実行時に吹く:私は、実行時にルートコレクションを掘る場合

public static string CategoryLandingPage(this UrlHelper helper, string seoCategoryName) 
    { 
     return helper.RouteUrl("Category");    
    } 

が、私はカテゴリのルートを見つけることができますが、.nameのプロパティの証拠はない、また私は見ていますどこでもUrlHelperのプロパティ(間抜けな難読化のための謝罪、後悔するより優れた安全)の間でルートの名前(資本Cとの「カテゴリー」): code snippet

誰もが私はUrlHelperの拡張メソッドを打つユニットテストを書くことができる方法を知っています名前でルートを参照していますか?ありがとう!

  • アップデート - 私は軽く私が働いているアプリケーションは、複数のMVC領域に分離されているという事実を考慮するために変更され、私はthis popular questionからもらったそのほとんどがテストの初期化、のいくつかを追加します:

    プライベートSoAndSoController CreateController() { var service = new Mock(); var cookieMgr = new Mock(); var logger = new Mock();

    var allRoutes = new RouteCollection(); 
    MvcApplication.RegisterRoutes(allRoutes); 
    var soAndSoAreaRegistration = new SoAndSoAreaRegistration(); 
    var soAndSoAreaRegistrationContext = new AreaRegistrationContext(soAndSoAreaRegistration.AreaName, new RouteCollection()); 
    soAndSoAreaRegistration.RegisterArea(soAndSoAreaRegistrationContext); 
    soAndSoAreaRegistrationContext.Routes.ForEach(r => allRoutes.Add(r)); 
    
    var request = new Mock<HttpRequestBase>(); 
    request.SetupGet(x => x.ApplicationPath).Returns("/"); 
    request.SetupGet(x => x.Url).Returns(new Uri("http://localhost/a", UriKind.Absolute)); 
    request.SetupGet(x => x.ServerVariables).Returns(new System.Collections.Specialized.NameValueCollection()); 
    
    var response = new Mock<HttpResponseBase>(); 
    response.Setup(x => x.ApplyAppPathModifier("/post1")).Returns("http://localhost/post1"); 
    
    var context = new Mock<HttpContextBase>(); 
    context.SetupGet(x => x.Request).Returns(request.Object); 
    context.SetupGet(x => x.Response).Returns(response.Object); 
    
    var controller = new SoAndSoController(service.Object, cookieMgr.Object, null, logger.Object, null); 
    controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller); 
    controller.Url = new UrlHelper(new RequestContext(context.Object, new RouteData()), allRoutes); 
    
    return controller; 
    

    }

+0

ユニットテストのいくつかについて質問し、ユニットテストのコードを表示しないでください。あなたを助けるのは難しいでしょう。 –

+0

テスト自体はsomeControllerを呼び出すだけです。ActionMethod(新しいSearchRequest {searchQuery = "いくつかの単語"});アクションメソッドにリターンリダイレクト(Url.CategoryLandingPage(wordsTheUserTypedIn);おそらくテストの初期化が関係していると思われます)を含めるように質問自体を追加します。 –

答えて

1

私はそれを考え出しました。私はそれを新しいRouteCollection渡すのではなく、AreaRegistrationContextに私RouteCollectionを渡すために必要な:

  var productFindingAreaRegistrationContext = new AreaRegistrationContext(productFindingAreaRegistration.AreaName, allRoutes); 

をしかし、それは爆破するために、この行を引き起こしていた。

productFindingAreaRegistrationContext.Routes.ForEach(r => allRoutes.Add(r)); 
しかし

今、この行が必要なくなりました私はそれをコメントアウトしました。 Voila。

関連する問題