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

Наистина съм нов в 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