Тестирование статических методов абстрактного php-класса, которым требуется, чтобы расширенные классы были значимыми

#php #phpunit

#php #phpunit

Вопрос:

У меня ситуация, когда я не вижу, как правильно ее протестировать.

Давайте предположим, что следующая структура:

  • MyAbstractBaseClass, который имеет статический метод getConstants, который возвращает все const-поля, в то время как MyAbstractBaseClass не имеет таких полей.
  • MyExtendingClass, который расширяет MyAbstractBaseClass

Теперь я хочу протестировать getConstants без использования конкретного расширения базового класса. Я видел, что можно получить макеты для реализаций абстрактного класса, но я не нашел возможности добавлять поля в макет, что было бы необходимо для создания значимого теста, который в то же время не зависит от конкретного расширения.

Итак, мой вопрос: как я могу этого добиться?

Комментарии:

1. «MyAbstractBaseClass, который имеет статический метод getConstants, который возвращает все const-поля, в то время как MyAbstractBaseClass не имеет таких полей» <- извините, что? 🙂 В любом случае, это, вероятно, лучше подойдет для softwareengineering.stackexchange.com , особенно если вы добавите несколько примеров кода, что очень помогло бы.

2. Извините -.- Но да … к счастью, у меня уже есть свой ответ. Спасибо за подсказку softwareengineering-stackexchange!

3. @Jeto при обращении к другим сайтам часто бывает полезно указать, что перекрестная публикация не одобряется

4. @gnat Это то, что я подразумевал (или, по крайней мере, пытался подразумевать) под «лучше подходит» (как в «это должно быть там, а не здесь»). Но я подумаю о том, чтобы в следующий раз явно упомянуть перекрестную публикацию, думаю, это не повредит.

Ответ №1:

Анонимные классы очень хорошо работают для такого рода тестов:

 final class MyAbstractBaseClassTest extends TestCase
{
    /**
     * @test
     */
    public function it_should_return_all_constants()
    {
        $subject = new class extends MyAbstractBaseClass {
            const SOME_CONSTANT = 'SOME VALUE';
            const ANOTHER_CONSTANT = 'ANOTHER VALUE';
        };

        self::assertEqualsCanonicalizing(['SOME_CONSTANT', 'ANOTHER_CONSTANT'], $subject::getConstants());
    }

    /**
     * @test
     */
    public function it_should_return_an_empty_list_when_there_are_no_constants()
    {
        $subject = new class extends MyAbstractBaseClass {};

        self::assertEquals([], $subject::getConstants());
    }
}
  

Комментарии:

1. Там мы видим, что я довольно новичок в php. Он может выполнять анонимные классы: D даже не думал об этом. Большое спасибо!