Я только вхожу в модульные тесты с использованием 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);
}
Итак, как мне избежать написания большого количества дублирующих тестов для классовчто все реализуют один и тот же интерфейс?