PHP Profi

Юнит тесты для трейтов в PHP7 Перевод

Небольшая заметка как можно тестировать трейты в PHP 7. Простой и изящный способ, найденный на просторах.

Т.к. PHP трейты не могут быть инстанциированы сами по себе, то их юнит-тестирование кажется невозможным. Однако, создав обычный класс, который использует трейт, вы можете легко написать код теста для этого трейта. Примерно так:

trait Greetable {
    public function hello(int $repeat): string {
        return str_repeat('Hello!', $repeat);
    }
}

class GreetableBeings {
    use Greetable;
}

class GreetableTest {
    public function testHello() {
        $g = new GreetableBeings();
        assert($g->hello(1) === 'Hello!');
        assert($g->hello(2) === 'Hello!Hello!');
        assert($g->hello(3) === 'Hello!Hello!Hello!');
    }
}

(new GreetableTest)->testHello();

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

Но поскольку в PHP 7 появились анонимные классы, нам больше не придется беспокоиться о создании класса для тестирования.

trait Greetable {
    public function hello(int $repeat): string {
        return str_repeat('Hello!', $repeat);
    }
}

class GreetableTest {
    public function testHello() {
        $g = new class { use Greetable; }; // anonymous class
        assert($g->hello(1) === 'Hello!');
        assert($g->hello(2) === 'Hello!Hello!');
        assert($g->hello(3) === 'Hello!Hello!Hello!');
    }
}

(new GreetableTest)->testHello();
2017-11-22 оригинал

Последние посты

Комментарии

авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий