#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 даже не думал об этом. Большое спасибо!