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

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

3 ответов


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

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

    return attributes.Length > 0;
}

используйте отражение, например, вот один в 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

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

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
Томас!--3-->