什么是断言在c#中将属性应用于方法的最短路径?

时间:2009-03-12 18:33:02

标签: c# unit-testing reflection nunit-2.5

断言在c#中将属性应用于方法的最短路径是什么?

我正在使用nunit-2.5

:)

3 个答案:

答案 0 :(得分:3)

MethodInfo mi = typeof(MyType).GetMethod("methodname");    

Assert.IsFalse (Attribute.IsDefined (mi, typeof(MyAttributeClass)));

答案 1 :(得分:1)

我不确定nunit使用的断言方法,但你可以简单地将这个布尔表达式用于传递给它的参数(假设你能够使用LINQ:

methodInfo.GetCustomAttributes(attributeType, true).Any()

如果应用了该属性,则它将返回true。

如果您想制作通用版本(而不是使用typeof),您可以使用通用方法为您执行此操作:

static bool IsAttributeAppliedToMethodInfo<T>(this MethodInfo methodInfo) 
    where T : Attribute
{
    // If the attribute exists, then return true.
   return methodInfo.GetCustomAttributes(typeof(T), true).Any();
}

然后在你的断言方法中调用它:

<assert method>(methodInfo.IsAttributeAppliedToMethodInfo<MyAttribute>());

要使用表达式执行此操作,您可以先定义以下扩展方法:

public static MethodInfo 
    AssertAttributeAppliedToMethod<TExpression, TAttribute>
    (this Expression<T> expression) where TAttribute : Attribute
{
    // Get the method info in the expression of T.
    MethodInfo mi = (expression.Body as MethodCallExpression).Method;

    Assert.That(mi, Has.Attribute(typeof(TAttribute)));
}

然后用这样的代码调用它:

(() => Console.WriteLine("Hello nurse")).
    AssertAttributeAppliedToMethod<MyAttribute>();

请注意,传递给方法的参数是什么并不重要,因为从不调用该方法,它只需要表达式。

答案 2 :(得分:0)

nunit 2.5的另一种选择:

var methodInfo = typeof(MyType).GetMethod("myMethod");

Assert.That(methodInfo, Has.Attribute(typeof(MyAttribute)));