web-dev-qa-db-fra.com

Puis-je simuler une implémentation d'interface avec PHPUnit?

J'ai une interface dont je voudrais me moquer. Je sais que je peux me moquer d'une implémentation de cette interface, mais existe-t-il un moyen de simplement se moquer de l'interface?

<?php
require __DIR__ . '/../vendor/autoload.php';

use My\Http\IClient as IHttpClient;  // The interface
use My\SomethingElse\Client as SomethingElseClient;


class SomethingElseClientTest extends PHPUnit_Framework_TestCase {
  public function testPost() {
    $url = 'some_url';
    $http_client = $this->getMockBuilder('Cpm\Http\IClient');
    $something_else = new SomethingElseClient($http_client, $url);
  }
}

Ce que je reçois ici est:

1) SomethingElseTest::testPost
Argument 1 passed to Cpm\SomethingElse\Client::__construct() must be an instance of
My\Http\IClient, instance of PHPUnit_Framework_MockObject_MockBuilder given, called in
$PATH_TO_PHP_TEST_FILE on line $NUMBER and defined

Fait intéressant, PHPUnit, interfaces simulées et instanceof suggère que cela pourrait fonctionner.

38
Dmitry Minkovsky

Au lieu de

$http_client = $this->getMockBuilder(Cpm\Http\IClient::class);

utilisation

$http_client = $this->getMock(Cpm\Http\IClient::class);

ou

$http_client = $this->getMockBuilder(Cpm\Http\IClient::class)->getMock();

Fonctionne totalement!

46
Dmitry Minkovsky

Ce qui suit fonctionne pour moi:

$myMockObj = $this->createMock(MyInterface::class);
13
Francesco Borzi
$http_client = $this->getMockBuilder(Cpm\Http\IClient::class)
                    ->setMockClassName('SomeClassName')
                    ->getMock();

setMockClassName () peut être utilisé pour résoudre ce problème dans certaines circonstances.

0
kervin