如何测试一个方法参数装饰有一个属性?(How to test that a method argum

2019-07-29 01:12发布

这可能是重复的,但我无法找到我要找的问题,所以我要求它。

你怎么测试方法的参数装饰着attribte? 例如,下面的MVC操作方法,使用FluentValidation的CustomizeValidatorAttribute

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

我敢肯定,我不得不强类型的lambda表达式使用反射,希望。 但不知道从哪里开始。

Answer 1:

一旦你了解了该方法的手柄, GetMethodInfo通过反射调用,您可以简单地调用GetParameters()对方法,然后对每个参数,您可以检查GetCustomAttributes()调用类型X.例如实例:

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调用到更具体的东西。



文章来源: How to test that a method argument is decorated with an attribute?