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