Mam problem z kpieniem z przeładowanej metody __get ($ index). Kod dla klasy być wyśmiewany, a system na podstawie testu, który zużywa się następująco:PHPUnit: Mocking __get() powoduje, że "__get() musi przyjmować dokładnie 1 argument ..."
<?php
class ToBeMocked
{
protected $vars = array();
public function __get($index)
{
if (isset($this->vars[$index])) {
return $this->vars[$index];
} else {
return NULL;
}
}
}
class SUTclass
{
protected $mocky;
public function __construct(ToBeMocked $mocky)
{
$this->mocky = $mocky;
}
public function getSnack()
{
return $this->mocky->snack;
}
}
testowy wygląda następująco:
<?php
class GetSnackTest extends PHPUnit_Framework_TestCase
{
protected $stub;
protected $sut;
public function setUp()
{
$mock = $this->getMockBuilder('ToBeMocked')
->setMethods(array('__get')
->getMock();
$sut = new SUTclass($mock);
}
/**
* @test
*/
public function shouldReturnSnickers()
{
$this->mock->expects($this->once())
->method('__get')
->will($this->returnValue('snickers');
$this->assertEquals('snickers', $this->sut->getSnack());
}
}
Prawdziwe kod jest trochę bardziej skomplikowane, choć niewiele, posiadające "getSnacks()" w swojej klasie nadrzędnej. Ale ten przykład powinien wystarczyć.
Problem pojawia się następujący błąd podczas wykonywania testu z PHPUnit:
Fatal error: Method Mock_ToBeMocked_12345672f::__get() must take exactly 1 argument in /usr/share/php/PHPUnit/Framework/MockObject/Generator.php(231)
Kiedy debugowanie nawet nie mogę dotrzeć do metody badawczej. Wygląda na to, że łamie się podczas zakładania fałszywego obiektu.
Wszelkie pomysły?
OK, testowałem trochę dalej. Problem wydaje się być na etapie budowy wyśmiewanej klasy. Jeśli utworzę go za pomocą -> setMethods (array ('blabla')), przechodzi on do metod testowych. Jeśli użyję -> setMethods (array ('__ get')) on pęka. – beToiba
Masz rację - problem polega na tym, jak php php generuje makiety - żadna z odpowiedzi poniżej tego nie dotyczy. Otrzymuję ten problem w PHPUnit 4.0 - jakiej wersji używasz? – HorusKol
Próbowałem odtworzyć to z różnymi kombinacjami wersji PHPUnit i jego zależności Mock Object od najnowszej dostępnej wersji (4.8.2 w momencie pisania) z powrotem do PHPUnit 3.5, i nie mogę tego złamać w ten sposób używając mojego środowisko - PHP 5.5 na Ubuntu 12.04.5 LTS. O ile oryginalny plakat nie może rozwinąć się w tej kwestii, pamiętając o kombinacji wersji, z których korzystali, zaleciłbym, aby to pytanie zostało zamknięte. – Benjamin