Tôi gặp sự cố khi mô phỏng phương thức __get ($ index) quá tải. Mã cho lớp để nhạo báng và hệ thống được kiểm tra mà tiêu thụ nó như sau:PHPUnit: Mocking __get() kết quả trong "__get() phải lấy chính xác 1 đối số ..."
<?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;
}
}
thử nghiệm trông như sau:
<?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());
}
}
mã thực là phức tạp hơn một chút, mặc dù không nhiều, có "getSnacks()" trong lớp cha của nó. Nhưng ví dụ này là đủ.
Vấn đề là tôi nhận được lỗi sau, khi thực hiện các thử nghiệm với PHPUnit:
Fatal error: Method Mock_ToBeMocked_12345672f::__get() must take exactly 1 argument in /usr/share/php/PHPUnit/Framework/MockObject/Generator.php(231)
Khi tôi gỡ lỗi tôi thậm chí không thể đạt được phương pháp thử nghiệm. Có vẻ như nó phá vỡ lúc thiết lập đối tượng giả.
Bất kỳ ý tưởng nào?
OK, tôi đã thử nghiệm thêm một chút. Vấn đề thực sự có vẻ là xây dựng lớp học chế nhạo. Nếu tôi tạo nó bằng -> setMethods (mảng ('blabla')), anh ta sẽ được thử nghiệm. Nếu tôi sử dụng -> setMethods (mảng ('__ get')) anh ta phá vỡ. – beToiba
Bạn nói đúng - vấn đề là phải làm gì với việc các đối tượng giả lập PHP đang tạo ra mô hình như thế nào - không có câu trả lời nào dưới đây giải quyết vấn đề này. Tôi nhận được vấn đề này trong PHPUnit 4.0 - bạn đang sử dụng phiên bản nào? – HorusKol
Tôi đã cố gắng tạo lại điều này với các kết hợp khác nhau của phiên bản PHPUnit và phụ thuộc Mock Object từ phiên bản mới nhất có sẵn (4.8.2 tại thời điểm viết) trở lại PHPUnit 3.5 và không thể phá vỡ theo cách này bằng cách sử dụng môi trường - PHP 5.5 trên Ubuntu 12.04.5 LTS. Trừ khi áp phích gốc có thể mở rộng về câu hỏi này bằng cách ghi nhớ sự kết hợp của các phiên bản mà họ đang sử dụng, tôi khuyên bạn nên đóng câu hỏi này. – Benjamin