2016-08-22 2 views
7

Wir haben unsere Systeme auf PHP7.0 aufgerüstet. Dies erforderte ein Upgrade von PHPUnit auf 5.5, da 4.8 PHP7 nicht richtig unterstützt. Dies erzeugt die folgenden Fehler, die einen Fehler in phpunit in unserer CI-NetzeUpgrade von PHPUnit von 4,8 auf 5,5

PHPUnit_Framework_TestCase::getMock() is deprecated, 
use PHPUnit_Framework_TestCase::createMock() or 
PHPUnit_Framework_TestCase::getMockBuilder() instead 

, wie es jetzt aussieht, ist, dass wir 1200+ Unit-Tests berühren müssen Refactoring, wie wir unsere Mocks bauen.

Gibt es eine Möglichkeit, diese Warnung zu unterdrücken, oder schnell unsere Verwendung von getMock zu createMock zu konvertieren, die so unterschiedlich zu arbeiten scheint, dass ein globales Suchen/Ersetzen es nicht schneidet?

+0

Es gibt Muster Adapter genannt. Schau es dir an. – jaro1989

+0

Legen Sie die Fehlerberichterstattung fest, um Verwerfungen auszublenden? 'error_reporting (E_ALL & ~ E_DEPRECATED);' http://php.net/function.error-reporting –

+0

@GerardRoche Ich denke, dass es eine schlechte Idee ist, die Abwertung zu verstecken. Wir arbeiten daran, unser Projekt so aktuell wie möglich zu gestalten. Es ist nur das Vermeiden von Problemen. – jaro1989

Antwort

5

Sie könnten zusätzliche Testklasse erstellen Testadapter genannt, die

PHPUnit_Framework_TestCase verlängern
class TestAdapter extends PHPUnit_Framework_TestCase 
{ 
    /** 
    * Override your deprecated method 
    */ 
    public function getMock() 
    { 
     return $this->createMock(); 
    } 
} 

Dann brauchen Sie nur aus dieser Klasse alle Tests zu erweitern.

+0

Wir konnten 'TestCase :: getMock()' in unsere 'TestAdapter' Klasse ohne Fehler kopieren, da anscheinend keines der Dinge, die' getMock() 'verwendet, als veraltet markiert sind. Aber das scheint zugegebenermaßen entgegengesetzt zu ihren Motiven zu sein, sie abzulehnen. – Umbrella

+0

Yup. Es gibt auch einige Vorteile von dieser zusätzlichen Ebene.Sie könnten Ihren duplizierten Code dorthin verschieben und ihn dann nach Bedarf trennen. Es geht darum, das gleiche Objekt zu verspotten und Dummy-Daten-Arrays usw. zu erstellen. Nachdem man es UnitTestHelper nennen konnte und man würde es nie bereuen – jaro1989

+0

Wie es passiert, hatten wir schon so eine Klasse, es ist mir gerade nicht in den Sinn gekommen In dieser Zwischenklasse haben wir unsere 'getMock()' Aufrufe ausgeführt, weshalb all unsere Tests (die bereits den MockBuilder verwenden) diese Warnung liefern. Dies macht diese Lösung nicht nur einfach, sondern sollte (für uns) selbstverständlich sein. – Umbrella

0

Folgende Arbeiten für meine alten Tests ...

/** 
* Returns a mock object for the specified class. 
* 
* This method is a temporary solution to provide backward compatibility for tests that are still using the old 
* (4.8) getMock() method. 
* We should update the code and remove this method but for now this is good enough. 
* 
* 
* @param string  $originalClassName  Name of the class to mock. 
* @param array|null $methods     When provided, only methods whose names are in the array 
*           are replaced with a configurable test double. The behavior 
*           of the other methods is not changed. 
*           Providing null means that no methods will be replaced. 
* @param array  $arguments    Parameters to pass to the original class' constructor. 
* @param string  $mockClassName   Class name for the generated test double class. 
* @param bool  $callOriginalConstructor Can be used to disable the call to the original class' constructor. 
* @param bool  $callOriginalClone  Can be used to disable the call to the original class' clone constructor. 
* @param bool  $callAutoload   Can be used to disable __autoload() during the generation of the test double class. 
* @param bool  $cloneArguments 
* @param bool  $callOriginalMethods 
* @param object  $proxyTarget 
* 
* @return \PHPUnit_Framework_MockObject_MockObject 
* 
* @throws \Exception 
*/ 
public function getMock($originalClassName, $methods = array(), array $arguments = array(), $mockClassName = '', $callOriginalConstructor = true, $callOriginalClone = true, $callAutoload = true, $cloneArguments = false, $callOriginalMethods = false, $proxyTarget = null) 
{ 
    $builder = $this->getMockBuilder($originalClassName); 

    if (is_array($methods)) { 
     $builder->setMethods($methods); 
    } 

    if (is_array($arguments)) { 
     $builder->setConstructorArgs($arguments); 
    } 

    $callOriginalConstructor ? $builder->enableOriginalConstructor() : $builder->disableOriginalConstructor(); 
    $callOriginalClone ? $builder->enableOriginalClone() : $builder->disableOriginalClone(); 
    $callAutoload ? $builder->enableAutoload() : $builder->disableAutoload(); 
    $cloneArguments ? $builder->enableOriginalClone() : $builder->disableOriginalClone(); 
    $callOriginalMethods ? $builder->enableProxyingToOriginalMethods() : $builder->disableProxyingToOriginalMethods(); 

    if ($mockClassName) { 
     $builder->setMockClassName($mockClassName); 
    } 

    if ($proxyTarget) { 
     $builder->setProxyTarget($proxyTarget); 
    } 

    $mockObject = $builder->getMock(); 

    return $mockObject; 
}