Если у вас есть классы, реализующие какой-либо один интерфейс, то все они должны реализовать методы в этом интерфейсе. Чтобы протестировать эти классы, вам нужно создать класс модульного теста для каждого из классов.
Пойдем по более умному маршруту; если ваша цель состоит в том, чтобы избежать дублирования кода и тестового кода , вы можете вместо этого создать абстрактный класс, который обрабатывает повторяющийся код .
например. у вас есть следующий интерфейс:
public interface IFoo {
public void CommonCode();
public void SpecificCode();
}
Возможно, вы захотите создать абстрактный класс:
public abstract class AbstractFoo : IFoo {
public void CommonCode() {
SpecificCode();
}
public abstract void SpecificCode();
}
Тестирование это легко; реализовать абстрактный класс в тестовом классе либо как внутренний класс:
[TestFixture]
public void TestClass {
private class TestFoo : AbstractFoo {
boolean hasCalledSpecificCode = false;
public void SpecificCode() {
hasCalledSpecificCode = true;
}
}
[Test]
public void testCommonCallsSpecificCode() {
TestFoo fooFighter = new TestFoo();
fooFighter.CommonCode();
Assert.That(fooFighter.hasCalledSpecificCode, Is.True());
}
}
... или позвольте тестовому классу расширять сам абстрактный класс, если вам это нравится.
[TestFixture]
public void TestClass : AbstractFoo {
boolean hasCalledSpecificCode;
public void specificCode() {
hasCalledSpecificCode = true;
}
[Test]
public void testCommonCallsSpecificCode() {
AbstractFoo fooFighter = this;
hasCalledSpecificCode = false;
fooFighter.CommonCode();
Assert.That(fooFighter.hasCalledSpecificCode, Is.True());
}
}
Наличие абстрактного класса, заботящегося об общем коде, который подразумевает интерфейс, дает намного более чистый дизайн кода.
Надеюсь, это имеет смысл для вас.
В качестве примечания, это общий шаблон проектирования, называемый Шаблонный шаблон . В приведенном выше примере шаблонным методом является метод CommonCode
, а SpecificCode
называется заглушкой или крючком. Идея состоит в том, что любой может продлить поведение без необходимости знать закулисные вещи.
Многие модели опираются на эту модель поведения, например, ASP.NET , где необходимо реализовать хуки на странице или пользовательские элементы управления, такие как сгенерированный метод Page_Load
, который вызывается событием Load
, метод шаблона вызывает хуки за кулисами , Есть еще много примеров этого. В основном все, что вам нужно реализовать, используя слова «load», «init» или «render», вызывается методом шаблона.