2016-08-22 10 views
7

Ulepszyliśmy nasze systemy do PHP 7.0. Wymagało to aktualizacji PHPUnit do wersji 5.5, ponieważ 4.8 nie obsługuje poprawnie PHP7. To daje następujący błąd, który Nets awarię w PHPUnit w naszym CIAktualizacja PHPUnit z 4.8 na 5.5

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

jak to wygląda teraz jest to, że musimy dotknąć 1200+ testy jednostkowe byłaby jak budujemy nasze mocks.

Czy istnieje sposób, aby ukryć to ostrzeżenie, lub szybko przekonwertować nasze zastosowania getMock na createMock, które wydaje się działać na tyle różnie, że globalne wyszukiwanie/zamiana nie będzie go zmniejszać?

+0

Jest wzór zwany Adapter. Spójrz na to. – jaro1989

+0

Ustaw raportowanie błędów, aby ukryć wycofanie? 'error_reporting (E_ALL i ~ E_DEPRECATED);' http://php.net/function.error-reporting –

+0

@GerardRoche Myślę, że to zły pomysł, aby ukryć wycofanie. Pracujemy nad tym, aby nasz projekt był jak najbardziej aktualny. To tylko unikanie problemu. – jaro1989

Odpowiedz

5

Można by utworzyć dodatkową klasę testową nazwie TestAdapter która rozszerzy PHPUnit_Framework_TestCase

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

Potem wystarczy przedłużyć wszystkich testów z tej klasy.

+0

Możemy dosłownie skopiować 'TestCase :: getMock()' do naszej klasy 'TestAdapter' bez żadnych błędów, ponieważ najwyraźniej żadna z rzeczy' getMock() 'nie jest oznaczona jako przestarzała. Chociaż, rzecz jasna, wydaje się to sprzeczne z ich motywacją, by je porzucić. – Umbrella

+0

Yup. Ponadto dodatkowa warstwa zapewnia dodatkowe korzyści.Możesz przenieść do niego swój zduplikowany kod, a następnie segregować go według potrzeb. Chodzi o wyśmiewanie tego samego obiektu i tworzenie fałszywych tablic danych itp. Po tym, jak mógłbyś nazwać go UnitTestHelper i nigdy byś nie żałował, że – jaro1989

+0

Tak się złożyło, że mieliśmy już taką klasę, po prostu nie przyszło mi to do głowy w tym czasie ta klasa pośrednia była tam, gdzie wykonywaliśmy nasze wywołania getMock(), dlatego wszystkie nasze testy (które już używają MockBuilder) dawały to ostrzeżenie. To sprawia, że ​​to rozwiązanie jest nie tylko proste, ale (powinno być) dla nas oczywiste. – Umbrella

0

następujące prace dla moich starych testów ...

/** 
* 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; 
}