Я просто участвую в модульных тестах с помощью 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);
}
Так как я могу избежать написания множества повторяющихся тестов для классов, которые реализуют один и тот же интерфейс?
wow, что является нарушенным поведением от VS модульного тестирования. если вы используете NUnit, он будет работать так, как вы ожидаете. –
Я бы сказал, что ваша проблема заключается не в написании тестов, они кажутся разумными подходами ко мне. проблема заключается в том, что поведение Busted в VS-модульном тестировании. –
Пока я не знаю ответа, метод «LickBalls» сделал меня LOL. – Scottie