2010-07-11 26 views
17

Tôi đang cố gắng để viết một bài kiểm tra đơn vị cho một bộ điều khiển sử dụng Zend và PHPUnitlàm thế nào để ghi đè php: // đầu vào khi thực hiện kiểm tra đơn vị

Trong đoạn code tôi lấy dữ liệu từ php: // đầu vào

$req = new Zend_Controller_Request_Http(); 
$data = $req->getRawBody(); 

Mã của tôi hoạt động tốt khi tôi thử nghiệm ứng dụng thực, nhưng trừ khi tôi có thể cung cấp dữ liệu dưới dạng bài đăng http thô, dữ liệu $ sẽ luôn trống. Phương thức getRawBody() về cơ bản gọi tệp_get_contents ('php: // input'), nhưng làm thế nào để ghi đè lên điều này để cung cấp dữ liệu thử nghiệm cho ứng dụng của tôi.

Trả lời

3

Cung cấp các $req->getRawBody() là, như bạn nói, giống như file_get_contents('php://input') ...

$test = true; /* Set to TRUE when using Unit Tests */ 

$req = new Zend_Controller_Request_Http(); 
if($test) 
    $data = file_get_contents('testfile.txt'); 
else 
    $data = $req->getRawBody(); 

Không phải là một giải pháp hoàn hảo, nhưng tương tự với những gì tôi đã sử dụng trong quá khứ khi thiết kế các kịch bản để xử lý các email bằng đường ống với thành công lớn.

+0

Yeap, không phải là một giải pháp hoàn hảo, nhưng làm thế nào tôi đã quyết định thực hiện nó quá. Cảm ơn. –

+0

Tôi sẽ không đề xuất giải pháp này - sử dụng câu lệnh 'if' để thực hiện các mã khác nhau trong các bài kiểm tra đơn vị so với sản xuất. Bạn lý tưởng muốn mã của bạn thực thi cùng một câu lệnh logic trong cả hai thế giới. Xem giải pháp @ MitMaro dưới đây sử dụng đường dẫn đầu vào có thể định cấu hình. –

7

Bạn có thể thử chế nhạo đối tượng trong các bài kiểm tra đơn vị của mình. Một cái gì đó như thế này:

$req = $this->getMock('Zend_Controller_Request_Http', array('getRawBody')); 
$req->method('getRawBody') 
    ->will($this->returnValue('raw_post_data_to_return')); 
+0

vì vậy điều này sẽ làm việc nếu tôi đã vượt qua đối tượng Zend_Controller_Request_Http vào mã tôi đã thử nghiệm, tiếc là bộ điều khiển xử lý tất cả điều này dưới mui xe. Vì vậy, tôi nghĩ rằng cách duy nhất để làm điều đó là thay đổi ứng dụng của tôi để kiểm tra môi trường tôi đang ở và xử lý trường hợp đặc biệt. –

10

tôi đã cùng một vấn đề và cách tôi cố định nó đã có chuỗi 'php://input' như là một biến đó là settable tại thời gian chạy. Tôi biết điều này không thực sự áp dụng trực tiếp cho câu hỏi này vì nó sẽ yêu cầu sửa đổi khung công tác Zend. Nhưng tất cả cùng nó có thể hữu ích cho ai đó.

Ví dụ:

<?php 
class Foo { 

    public function read() { 
     return file_get_contents('php://input'); 
    } 
} 

sẽ trở thành

<?php 
class Foo { 

    public $_fileIn = 'php://input'; 

    public function read() { 
     return file_get_contents($this->_fileIn); 
    } 

} 

Sau đó, trong bài kiểm tra đơn vị của tôi, tôi có thể làm:

<?php 
$obj = new Foo(); 
$obj->_fileIn = 'my_input_data.dat'; 
assertTrue('foo=bar', $obj->read()); 
+2

bạn cũng có thể có một thuộc tính được bảo vệ và thay đổi nó thành công khai bằng cách sử dụng sự phản chiếu trong các bài kiểm tra. Vì vậy, để sản xuất mã của bạn là một chút sạch hơn. (Giả sử php 5.3) – edorian

0

Zend_Controller_Request_HttpTestCase chứa phương pháp để thiết lập và nhận được yêu cầu http khác nhau/phản hồi.

Ví dụ: $req = new Zend_Controller_Request_HttpTestCase; $req->setCookie('cookie', 'TRUE'); $test = $this->controller->cookieAction($req); $this->assertSame($test, TRUE);

Các vấn đề liên quan