phpunit - как проверить свойство как объект - PullRequest
0 голосов
/ 27 марта 2020

У меня есть два класса.

class Posts {

  public function retrieve(): array {
   // Do something
  }

}

И

class PostsGateway {

 public $entity;

 function __construct() {
  $this->entity = new Posts();
 }

 public function retrieve(): array {
  return $this->entity->retrieve();
 }

}

Я хочу проверить поведение метода PostsGateway класса retrieve. Свойство entity является объектом, поэтому я присваиваю этому свойству другой макет, предназначенный для Posts класса.

Я устанавливаю ожидание для макета Posts, который я назначил свойству entity в PostsGateway mock.


use PHPUnit\Framework\TestCase;

class PostsGatewayTest extends TestCase {

    /**
     * Test `retrieve` behavior.
     */
    public function testRetrieve() {
        $postsMock                = $this->createMock( Posts::class );
        $postsGatewayMock         = $this->createMock( PostsGateway::class );
        $postsGatewayMock->entity = $postsMock;

        $postsGatewayMock->entity->expects( $this->once() )->method( 'retrieve' );

        $data = $postsGatewayMock->retrieve();
    }

}

Когда я запускаю тест, он терпит неудачу со следующей ошибкой.

PostsGatewayTest::testRetrieve

Expectation failed for method name is equal to 'retrieve' when invoked 1 time(s).
Method was expected to be called 1 times, actually called 0 times.

1 Ответ

0 голосов
/ 12 апреля 2020

Что ж, издеваться над классом - это недостаточно, вам нужно связать высмеиваемый класс с реальным классом, чтобы PostsGateway мог понять об этом. В этом случае вы можете использовать инжекцию конструктора для передачи имитируемого класса.

$mockPosts = $this->createMock(Posts::class);
$mockPosts->expects($this->once())->method('retrieve')->withAnyParameters();

$postsGateway = new PostsGateway($mockPosts);
$postsGateway->retrieve();

И класс PostsGateway должен измениться на

class PostsGateway {

    public $entity;

    function __construct($posts) {
        $this->entity = $posts;
    }

    public function retrieve(): array {
        return $this->entity->retrieve();
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...