Как объединить атрибуты с MsTest с помощью C #? - PullRequest
7 голосов
/ 10 января 2011

Как проверить наличие атрибутов класса и атрибутов метода с помощью MsTest с использованием C #?

Ответы [ 3 ]

8 голосов
/ 10 января 2011

C # Метод расширения для проверки атрибутов

public static bool HasAttribute<TAttribute>(this MemberInfo member) 
    where TAttribute : Attribute
{
    var attributes = 
        member.GetCustomAttributes(typeof(TAttribute), true);

    return attributes.Length > 0;
}
4 голосов
/ 10 января 2011

Используйте рефлексию, например, это единица в nunit + c #, которая легко адаптируется к MsTest.

[Test]
public void AllOurPocosNeedToBeSerializable()
{
  Assembly assembly = Assembly.GetAssembly(typeof (PutInPocoElementHere));
  int failingTypes = 0;
  foreach (var type in assembly.GetTypes())
  {
    if(type.IsSubclassOf(typeof(Entity)))
    {
       if (!(type.HasAttribute<SerializableAttribute>())) failingTypes++;
       Console.WriteLine(type.Name);
       //whole test would be more concise with an assert within loop but my way
       //you get all failing types printed with one run of the test.
    }
  }
  Assert.That(failingTypes, Is.EqualTo(0), string.Format("Look at console output 
     for other types that need to be serializable. {0} in total ", failingTypes));
}

//refer to Robert's answer below for improved attribute check, HasAttribute
1 голос
/ 10 января 2011

Напишите себе две вспомогательные функции (используя отражение) по следующим строкам:

public static bool HasAttribute(TypeInfo info, Type attributeType)
public static bool HasAttribute(TypeInfo info, string methodName, Type attributeType)

Затем вы можете написать такие тесты:

Assert.IsTrue(HasAttribute(myType, expectedAttribute));

Таким образом, вам не нужноиспользуйте if / else / foreach или другую логику в ваших тестовых методах.Таким образом они становятся намного более ясными и читаемыми.

HTHТомас

...