Как избежать написания дублирующих модульных тестов для классов, реализующих один и тот же интерфейс?

Я только начинаю использовать модульные тесты с помощью Visual Studio 2010. Мне интересно, есть ли рабочий процесс, который бы позвольте мне создать серию тестов, которые применяются к интерфейсу, а затем применить эти тесты интерфейса ко всем без исключения классам, реализующим интерфейс.

Например, скажем, у меня есть следующий интерфейс.

public interface IAnimal
{
   public string Name {get;}
   public string Speak();
}

Я, очевидно, мог бы иметь номер классов, реализующих этот интерфейс.

public class Dog:IAnimal
{
  public string Name {get{return "Dog";}}
  public string Speak{return "BARK BARK";}
  public bool LickBalls();
}

public class Cat:IAnimal
{
  public string Name {get{return "Cat";}}
  public string Speak{return "MEOW MEOW";}
  public bool Scratch();
}

Итак, я хотел бы определить серию тестов, которые применимы ко всем IAnimals

   public TestAnimalName(IAnimal animal)
   {      
       Assert.IsFalse(string.IsNullorEmpty(animal.Name));
   }

   public TestAnimalSpeak(IAnimal animal)
   {      
       string sound = animal.Speak();
       Assert.IsFalse(string.IsNullOrEmpty(sound));
   }

Затем я хотел бы определить основной метод TestAnimal () , который можно было бы использовать для тестирования любой IAnimal .

TestAnimal(IAnimal animal)
{
    TestAnimalName(animal);
    TestAnimalSpeak(animal);
}

Я мог бы затем вызвать этот метод TestAnimal () при тестировании конкретного типа IAnimal .

[TestMethod]
TestCat()
{
    Cat c = new Cat();
    TestAnimal(c);
}

[TestMethod]
TestDog()
{
    Dog c = new Dog();
    TestAnimal(c);
}

Но когда я попытаюсь сделать в Visual Studio игнорируются Asserts в вызываемых методах. Я попытался упростить проблему с помощью метода ниже и обнаружил, что он прошел, хотя вызывает метод, который должен привести к сбою.

[TestMethod]
public void AssertInCalledMethod() //this will pass
{
    Assert.IsTrue(true);
    Blah();
}

public void Blah()
{
    Assert.IsTrue(false);
}

Итак, как мне избежать написания большого количества повторяющихся тестов для классов, которые все реализуют один и тот же интерфейс ?

7
задан Eric Anastas 10 November 2010 в 22:36
поделиться