МЕТОДЫ ИСПЫТАНИЙ БЛОКА PHP - PullRequest
0 голосов
/ 31 октября 2019

Объектные интерфейсы ¶ Объектные интерфейсы позволяют создавать код, который определяет, какие методы должен реализовывать класс, без необходимости определять, как эти методы реализованы.

Интерфейсы определяются так же, как класс, нос ключевым словом interface, заменяющим ключевое слово class, и без какого-либо из методов, определяющих их содержимое.

Все методы, объявленные в интерфейсе, должны быть открытыми;это природа интерфейса.

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

реализует ¶ Дляреализовать интерфейс, используется оператор реализует. Все методы в интерфейсе должны быть реализованы внутри класса;Невыполнение этого приведет к фатальной ошибке. При желании классы могут реализовывать более одного интерфейса, разделяя каждый интерфейс запятой.

1 Ответ

1 голос
/ 31 октября 2019

Статические вызовы являются фиксированными зависимостями и их следует избегать. Если вы используете внедрение зависимостей, вы можете заменить зависимости заглушками и / или макетами.

При этом DamageCalculator также может быть интерфейсом и обеспечивать различные реализации.

use PHPUnit\Framework\TestCase;

interface HeroInterface {
  public function getAttack(): int;

  public function getDefence(): int;

  public function getHealthPoints(): int;

  public function setHealthPoints(int $healthPoints);
}

interface DamageCalculatorInterface {

  public function calculateDamage(HeroInterface $attacker, HeroInterface $defender): int;
}

class FightService {
  /**
   * @var DamageCalculatorInterface
   */
  private $_damageCalculator;

  public function __construct(DamageCalculatorInterface $damageCalculator) {
    $this->_damageCalculator = $damageCalculator;
  }

  public function fight(HeroInterface $attacker, HeroInterface $defender) {
    $damage = $this->_damageCalculator->calculateDamage($attacker, $defender);

    $defender->setHealthPoints($defender->getHealthPoints() - $damage);
  }
}

class FightServiceTest extends TestCase {

  public function testFight(): void {
    $attacker = $this->createMock(HeroInterface::class);
    $defender = $this->createMock(HeroInterface::class);
    $defender
      ->expects($this->once())
      ->method('getHealthPoints')
      ->willReturn(21);
    $defender
      ->expects($this->once())
      ->method('setHealthPoints')
      ->with(16);

    $damageCalculator = $this->createMock(DamageCalculatorInterface::class);
    $damageCalculator
      ->expects($this->once())
      ->method('calculateDamage')
      ->with($attacker, $defender)
      ->willReturn(5);

    $fightService = new FightService($damageCalculator);
    $fightService->fight($attacker, $defender);
  }
}
...