2

これはおそらく重複していますが、探している質問が見つからないので、質問しています。

メソッドの引数が属性で装飾されていることをどのようにテストしますか? たとえば、次の MVC アクション メソッドでは、FluentValidation を使用していますCustomizeValidatorAttribute

[HttpPost]
[OutputCache(VaryByParam = "*", Duration = 1800)]
public virtual ActionResult ValidateSomeField(
    [CustomizeValidator(Properties = "SomeField")] MyViewModel model)
{
    // code
}

できれば強く型付けされたラムダを使用して、リフレクションを使用する必要があると確信しています。しかし、どこから始めればよいかわかりません。

4

1 に答える 1

3

GetMethodInfoリフレクションを介した呼び出しでメソッドのハンドルを取得したら、そのメソッドを呼び出すだけで、各パラメーターについて、型 X のインスタンスの呼び出しをGetParameters()調べることができます。次に例を示します。GetCustomAttributes()

Expression<Func<MyController, ActionResult>> methodExpression = 
    m => m.ValidateSomeField(null);
MethodCallExpression methodCall = (MethodCallExpression)methodExpression.Body;
MethodInfo methodInfo = methodCall.Method;

var doesTheMethodContainAttribute = methodInfo.GetParameters()
      .Any(p => p.GetCustomAttributes(false)
           .Any(a => a is CustomizeValidatorAttribute)));

Assert.IsTrue(doesTheMethodContainAttribute);

たとえば、このテストでは、いずれかのパラメーターに属性が含まれているかどうかがわかります。特定のパラメーターが必要な場合は、GetParameters呼び出しをより具体的なものに変更する必要があります。

于 2012-04-17T19:22:07.200 に答える