2

이것은 중복되었을 가능성이 있지만 찾고있는 질문을 찾을 수 없어서 묻습니다.메서드 인수가 특성으로 장식되어 있는지 테스트하는 방법은 무엇입니까?

메서드 인수가 특성을 사용하여 장식 된 것을 어떻게 테스트합니까? 예를 들어, 사용하여 다음 MVC 액션 메소드, FluentValidation의 CustomizeValidatorAttribute :

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

나는 강력한 형식의 람다와 희망, 반사를 사용해야합니다 확신합니다. 그러나 어디서부터 시작해야할지 모르겠습니다.

답변

3

당신이 반사를 통해 GetMethodInfo 전화와 방법에 대한 핸들을 일단, 당신은 단순히 그 방법에 GetParameters()를 호출 할 수 있습니다, 다음 각 매개 변수에, 당신은 예를 들어 X 타입의 인스턴스에 대한 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 호출을보다 구체적인 것으로 변경해야합니다.

+0

빠른 답변 감사드립니다. MethodInfo를 가져 오는 예제 코드를 제공하기 위해 질문을 편집했습니다. – danludwig