2010-06-16 14 views
9

PHPUnit ile ham PHP kodunu test etmek oldukça kolaydır, ancak cookie'leri ağır bir şekilde kullanan kod nedir? Seanslar iyi bir örnek olabilir.Çerezleri ve oturumları test etmek için PHPUnit'i kullanma, nasıl?

Testim sırasında verilerle $_COOKIE kurulumunu gerektirmeyen bir yöntem var mı? Bir şeyler yapmanın korkunç bir yolu gibi geliyor.

+0

Hacky üzerinde ayrıntı yapabilir misiniz? Testin 'setUp'ında sadece unset ($ _ COOKIE) var mı? –

+0

Testlerimde bununla ilgilenmek istemiyorum. Gereksiz dağınıklığı hissediyorum ve otomatik olarak ele alınmalıdır. –

cevap

5

Bu, özellikle de laggacy PHP kodu olmak üzere kodla ilgili yaygın bir sorundur. Kullanılan genel teknik, ilgili nesnelerdeki COOKIE/SESSION değişkenlerini daha fazla soyutlamak ve bu bağımlılıkları kapsam içine almak için kontrol tekniği (ler) inin ters çevrilmesini kullanmaktır. Eğer test önce

http://martinfowler.com/articles/injection.html

Artık bir Çerez/Oturum nesnenin sahte sürümünü örneğini ve varsayılan bilgileri görebilirsiniz.

Sanırım, aynı efekti, eski kod ile testi gerçekleştirmeden önce süper küresel değeri geçersiz kılarak elde edilebilir.

Alkış, Alex

2

Ben bu oldukça eskidir anlıyorum ama bu teknoloji orijinal yayına yana iyileşmiştir olarak güncellenmesi gerekiyor inanıyoruz. Ben PHPUnit 3.7 ile php 5.4 kullanarak bu çözüm ile çalışan oturumları elde edebilir:

class UserTest extends \PHPUnit_Framework_TestCase { 
    //.... 
    public function __construct() { 
     ob_start(); 
    } 

    protected function setUp() { 
     $this->object = new \User(); 
    } 

    public function testUserLogin() { 
     $this->object->setUsername('test'); 
     $this->object->setPassword('testpw'); 
     // sets the session within: 
     $this->assertEquals(true, $this->object->login()); 
    } 
} 
+1

Daha fazla araştırma beni (benim aklımda) bir ek açıklama olarak çıktı arabelleklemenin doğru uygulamasına yönlendirdi: @outputBuffering etkin İşlevdeki açıklamalara ekleyin ve arabelleğe alma sorununu halledin. – Etrahkad

0
Ben bir kombinasyonu yoluyla, seans dayanır web siteme bir parçası davranışını test etmek için PHPUnit kullanabilirsiniz bulundu

Curl ve çerezi oturum kimliği oturumunu geçen bir tanımlama bilgisi.

Aşağıdaki Curl sınıfı, bir oturum parametresi geçirmek için CURLOPT_COOKIE seçeneğini kullanır. $sessionid statik değişkeni, oturumu farklı Curl çağrıları arasında kaydeder. Ayrıca, oturumlar changeSession statik işlevi kullanılarak değiştirilebilir. Özellikle Curl::changeSession() denir sürece

class Curl { 
    private $ch; 
    private static $sessionid; 

    public function __construct($url, $options) { 
     $this->ch = curl_init($url); 

     if (!self::$sessionid) 
      self::$sessionid = .. generateRandomString() ..; 

     $options = $options + array(
      CURLOPT_RETURNTRANSFER => true, 
      CURLOPT_COOKIE => 'PHPSESSID=' . self::$sessionid); 

     foreach ($options as $key => $val) { 
      curl_setopt($this->ch, $key, $val); 
     } 
    } 

    public function getResponse() { 
     if ($this->response) { 
      return $this->response; 
     } 

     $response = curl_exec($this->ch); 
     $error = curl_error($this->ch); 
     $errno = curl_errno($this->ch); 
     $header_size = curl_getinfo($this->ch, CURLINFO_HEADER_SIZE); 
     $this->header = substr($response, 0, $header_size); 
     $response = substr($response, $header_size); 

     if (is_resource($this->ch)) { 
      curl_close($this->ch); 
     } 

     if (0 !== $errno) { 
      throw new \RuntimeException($error, $errno); 
     } 

     return $this->response = $response; 
    } 

    public function __toString() { 
     return $this->getResponse(); 
    } 

    public static function changeSession() { 
     self::$SESSIONID = Practicalia::generateRandomString(); 
    } 
} 

bir örnek çağrı

$data = array(
    'action' => 'someaction', 
    'info' => 'someinfo' 
); 

$curl = new Curl(
    'http://localhost/somephp.php', 
    array(
     CURLOPT_POSTFIELDS => http_build_query($data))); 

$response = $curl->getResponse(); 

Ve sonradan Bukle çağrıları otomatik olarak bir önceki ile aynı oturumu kullanacaktır.

İlgili konular