Я пишу класс, который унаследует интерфейс. Код клиента будет написан для этого интерфейса, а класс написан для его поддержки. Идея заключается в том, что позже я напишу другие классы для этого интерфейса, и объекты этих двух разных классов должны быть полностью взаимозаменяемыми. Вместо того, чтобы писать тестовый класс для этого первого класса, я хочу написать один для интерфейса.
Я планировал написать тестовый класс, который бы принимал объект конструктора для конструктора (внедрение зависимости), и использовал фабрику для создания новых экземпляров тестируемого класса.
Таким образом, если бы я хотел проверить ClassA, я мог бы передать объект ClassAFactory в конструктор тестового класса, и если бы я хотел проверить ClassB, я бы передал объект ClassBFactory. Оба класса предназначены для взаимозаменяемости, и поскольку предполагается, что тестируются только общедоступные методы, это кажется идеальным.
А как насчет тестирования конструктора? Буду ли я лучше писать абстрактный тестовый класс и реализовывать тесты конструктора в классах, которые наследуют абстрактный тестовый класс (разные классы могут создаваться по-разному)?
Если бы я использовал первую идею, я думаю, у меня был бы тестовый класс для каждого тестируемого класса, например:
class ClassATest extends [PHPUnit test case]
{
$myFactory = new ClassAFactory();
$myTest = new ClassTest($myFactory);
$myTest->test1();
$myTest->test2();
//etc.
}
Какой лучший способ сделать это? Я хочу провести общий тест, чтобы, когда я пишу новые классы для реализации общего интерфейса, я мог просто поместить объект тех же тестов, что и для других. Но, учитывая, что разные классы будут иметь разные конструкторы, возможно, было бы лучше написать абстрактный тестовый класс и расширить его для каждого нового объекта? Что ты думаешь?