2010-07-11 23 views
17

ben php veri almak kodunda Zend ve PHPUnitphp geçersiz nasıl: birim testleri yaparken // giriş

kullanarak bir denetleyici için bir birim test yazmaya çalışıyorum: // girişi

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

Gerçek uygulamamı test ettiğimde kodum düzgün çalışıyor, ancak verileri ham bir http gönderi olarak sağlayamadıkça, $ data her zaman boş olacaktır. GetRawBody() yöntemi temel olarak file_get_contents ('php: // input') işlevini çağırır, ancak test verilerini uygulamaya aktarmak için bunu nasıl geçersiz kılarım? $req->getRawBody() Sağlanan

cevap

3

dediğiniz gibi ... file_get_contents('php://input') aynı,

$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(); 

Değil mükemmel bir çözümdür, fakat borulu e-postaları ele komut dosyalarını tasarlarken ben geçmişte kullanmış ne benzer büyük başarı.

+0

Yeap değil mükemmel bir çözüm, ama ben de bunu uygulamaya karar verdik nasıl. Teşekkürler. –

+0

Bu çözümü tavsiye etmem - "if" ifadelerini kullanarak birim testlerinde üretime karşı farklı kodlar gerçekleştiriyorum. İdeal olarak kodunuzun her iki dünyada da aynı mantıksal ifadeleri yürütmesini istiyorsunuz. Aşağıdaki yapılandırılabilir giriş yolunu kullanan @ MitMaro'nun çözümüne bakın. –

7

Nesneye birim testlerinizde alay etmeyi deneyebilirsiniz. Böyle bir şey:

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

Bu yüzden Zend_Controller_Request_Http nesnesini test ettiğim koda geçirirsem işe yarar, maalesef denetleyici kaputun altında tüm bunları idare eder. Bu yüzden, bunu yapmanın tek yolunun, başvurumu yaptığım çevreyi test etmek ve özel durumu ele almak için değiştirmekti. –

10

Aynı sorun ve bunu çalışma zamanında ayarlanabilen bir değişken olarak 'php://input' dize sahip olmaktı sabit yolu vardı. Zend Framework'ü değiştirmeyi gerektireceğinden, bu sorunun doğrudan doğruya geçerli olmadığını biliyorum. Ama hepsi aynı kişi için yararlı olabilir.

Örneğin

:

<?php 
class Foo { 

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

<?php 
class Foo { 

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

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

} 

Sonra benim birim sınama Yapabileceğim olacak:

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

da korumalı bir mülke sahip olabilir ve testlerde yansımayı kullanarak kamuya değiştirebilirsiniz. Yani üretim için kodunuz biraz daha temiz. (Varsayım php 5.3) – edorian

0

Zend_Controller_Request_HttpTestCase/ayarlanması ve çeşitli http isteği elde etme yöntemlerini içerir tepkiler.

Örneğin

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

İlgili konular