PHPUnit - Написание тестового класса для интерфейса и тестирование объектов с использованием фабрики

Я пишу класс, который унаследует интерфейс. Для этого интерфейса будет написан клиентский код, а для его поддержки - класс. Идея состоит в том, что позже я напишу другие классы для этого интерфейса, и объекты этих двух разных классов должны быть полностью взаимозаменяемыми. Вместо того, чтобы писать тестовый класс для этого первого класса, я хочу написать один для интерфейса.

Я планировал написать тестовый класс, который будет использовать фабричный объект для конструктора (внедрение зависимостей) и использовать фабрику для создания новых экземпляров тестируемого класса.

Таким образом, если бы я хотел протестировать ClassA, я мог бы передать объект ClassAFactory конструктору тестового класса, а если бы я хотел протестировать ClassB, я бы передал бы объект ClassBFactory. Оба класса предназначены для взаимозаменяемости, и, поскольку предполагается, что тестируются только общедоступные методы, это кажется идеальным.

А как насчет тестирования конструктора? Могу ли я лучше написать абстрактный тестовый класс и внедрить тесты конструктора в классы, наследующие абстрактный тестовый класс (разные классы могут быть созданы по-разному)?

Если бы я действительно использовал первую идею, я думаю, у меня был бы тестовый класс для каждый тестируемый класс, например:

class ClassATest extends [PHPUnit test case]
{
    $myFactory = new ClassAFactory();
    $myTest = new ClassTest($myFactory);

    $myTest->test1();
    $myTest->test2();
    //etc.
}

Как лучше всего это сделать? Я хочу иметь общий тест, чтобы, когда я пишу новые классы для реализации общего интерфейса, я могу просто поместить объект тех же тестов, что и для других. Но, учитывая, что у разных классов будут разные конструкторы, возможно, было бы лучше написать абстрактный тестовый класс и расширить его для каждого нового объекта? Как вы думаете?

13
задан Lewis Bassett 23 December 2011 в 14:52
поделиться