2011-06-23 3 views
0

私は自明ではない「単体テスト」(おそらくは「UIテスト」と呼ばれることもある)を書いています。この場合、適切なアクションハンドラをすべて見つけて、そのサイトマップにそれらのアクションハンドラのノードがあることを確認するテストが必要です。私が必要とするのは、開発者がページをシステムに追加してSiteMapに追加することを忘れた場合です(これは一般的な問題であると思われます。私たちのために)。最終的には、ユーザーが着陸できるページがSiteMapにホームを持っていることを確認して、適切なブレッドクラムを作成して、システム内のどこにいるかをユーザーに伝えます(ブレッドクラム部分は、ページがSiteMap内にある限り)。私はむしろ、私たちが対処しなければならないもう一つのことである、私たちにいくつかの政策/手続きの更新を強制するよりも、むしろテストでこれをやろうとします。すべてのMVCアクションハンドラを反復して、それらがSiteMap内にあることを確認するには?

この取り組みの中で、いくつかの既存のコードに関するヒントはありますか?そしてもしそうでなければ、これを行う最善の方法に関する考えはありますか?

私が検討している可能性の1つは、返品タイプがJsonResultではないAcceptVerbs属性で装飾されている方法を慎重に特定することです(とはっきりと「ウェブページ」ではないFileResult)。そして、おそらくSystem.Web.Mvc.Controllerを継承するクラスを最初に特定することによって、私の検索を制限するでしょう。

これを行うには、より良い方法をお聞きしたいと思います。これのほとんどがすでに書かれていて、私の時間を節約するために共有されていれば、さらにもっと愛するでしょう。 :-)

私が見

答えて

0

私の解決策の重要な部分は次のとおりです。これは私たちのためにうまくいく。

internal List<MethodInfo> UnfilteredActionHandlers { get; set; } 
    internal List<MethodInfo> ActionHandlersExcludingFilteredReturnTypes { get; set; } 
    internal List<MethodInfo> ActionHandlersFilteredByAttributes { get; set; } 
    internal List<MethodInfo> ActionHandlersFilteredByBoth { get; set; } 


    internal static List<Type> ReturnTypesToIgnore { get; set; } 
    internal static List<Type> RequiredAttributes { get; set; } 
    internal static List<Type> ControllerClassesToIgnore { get; set; } 
 var mvcAssembly = typeof (AccountController).Assembly; 
     AllControllers = mvcAssembly.GetTypes().Where(type => type.IsSubclassOf(typeof (Controller))).ToList(); 
     UnfilteredActionHandlers = new List<MethodInfo>(); 
     foreach (var controller in AllControllers) 
     { 
      UnfilteredActionHandlers.AddRange(controller.GetMethods() 
                .Where(methodInfo => 
                 typeof (ActionResult).IsAssignableFrom(methodInfo.ReturnType) 
                 && !ControllerClassesToIgnore.Contains(methodInfo.ReflectedType))); 
     } 

は、我々は、我々はそれらを使用する方法に応じてによってUnfilteredActionHandlersコレクションをフィルタリングし、いくつかのコレクションを持っています
0

これは、MVCアプリケーション=> ソリューションが

は、あなたのようにマークされていないすべてのオプションを知っている(me_のために)ルーティングにあるでしょうで[nonaction] Global.asaxの に登録されています

AreaRegistration.RegisterAllAreas(); 
    RegisterRoutes(RouteTable.Routes); 

が含まれており、このルートでは、すべてのアクセス方法を見つけることができるようになります=>例えば、これは基本的なMVCで作成され

アクション

これが役に立ちます

関連する問題