Тестовый абстрактный класс через конкретный класс

Я действительно новичок в PHPSpec и BDD в целом, поэтому, возможно, мое предположение не очень хорошее, в этом случае, пожалуйста, поправьте меня.

Рассмотрим этот сценарий

//src/myBundle/Model/FooInterface
interface FooInterface
{
    [...]
}

//src/myBundle/Model/FooAbstractManager
abstract class FooAbastractManager implements FooInterface
{
    public function aCommonMethodForAllConcrete()
    {
        [...]
    }
}

Хорошо, допустим, что aCommonMethodForAllConcrete() разделяет некоторую реализацию со всеми конкретными классами, и что я хочу написать тестовый пример только один раз.

У меня наконец (поправьте меня, если я ошибаюсь) появилась «идея»: создать конкретный FooAbstractManager только для проверки этого общего метода и оставил все тесты конкретных методов конкретным классам.

НО, поскольку я не хочу, чтобы этот FooAbstractManager был частью моей src кодовой базы, идеальной ситуацией было бы включить этот класс только в конкретный подкаталог папки spec.

Вопрос: как я могу настроить это поведение БЕЗ указания, что ВСЕ /src/myBundle/Model файлы, разделенные по именам, будут там (так как, может быть, завтра мне нужно будет сохранить конкретный файл класса прямо там)?


person DonCallisto    schedule 09.09.2015    source источник


Ответы (2)


Вы правы, вы можете создать конкретный класс просто для тестирования. Он должен расширять абстрактный класс и предоставлять фиктивные реализации абстрактных методов абстрактного класса (если таковые имеются).

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

Это своего рода «официальный» способ тестирования абстрактных классов. Отметьте «Ограничение № 5» в этой статье написано одним из phpspec создателей.

person axiac    schedule 09.09.2015

Взгляните на этот пример, он делает то, что вам нужно: https://github.com/Sylius/Translation/blob/master/spec/Model/AbstractTranslatableSpec.php

person gvf    schedule 09.09.2015