2013-05-10 28 views
6

bu kodu düşünün formda herhangi bir şekilde (buna bir alan eklemek gibi), talebin siyah-h olmasına neden olur OLED.CakePHP Denetleyici Testi

Testi Kod

<?php 

class UsersControllerTest extends ControllerTestCase { 

    public function testExamplePostValidData() { 
     $this->Controller = $this->generate('Users', array(
      'components' => array(
       'Security' 
      ) 
     )); 

     $data = array(
      'User' => array(
       'name' => 'John Doe' 
      ) 
     ); 

     $this->testAction('/users/example', array('data' => $data, 'method' => 'post')); 
     $this->assertTrue($this->vars['some_var']); 
    } 

    public function testExamplePostInvalidData() { 
     $this->Controller = $this->generate('Users', array(
      'components' => array(
       'Security' 
      ) 
     )); 

     $data = array(
      'User' => array(
       'name' => 'John Doe', 
       'some_field' => 'The existence of this should cause the request to be black-holed.' 
      ) 
     ); 

     $this->testAction('/users/example', array('data' => $data, 'method' => 'post')); 
     $this->assertTrue($this->vars['some_var']); 
    } 
} 

testExamplePostInvalidData çünkü $data dizide olmak some_field arasında başarısız gereken ikinci testi, ancak geçirir: Bunu test etmek isterim! Neyi yanlış yapıyorum?

cevap

1

-> testAction verisindeki 'some_field' öğesini ekleyerek, güvenlik bileşeni, alanın uygulamanızın bir parçası olduğunu (kodunuzdan geldiği için bir POST dizisinden değil) göreceğinden, görünmeyecektir. "hack girişimi" olarak.

Kara deliklerin kontrol edilmesi biraz daha kıvrımlıdır. Ancak Kek çekirdeği testleri zaten karadelik işlevlerini test eder, bu nedenle bu testler başarılı olursa, uygulamanızda kontrol etmeniz gerekmez. Gerçi ısrar ederse

, rehberlik için çekirdek Kek testlerini göz atın: Özellikle

:

/** 
* test that validatePost fails if any of its required fields are missing. 
* 
* @return void 
*/ 
public function testValidatePostFormHacking() { 
    $this->Controller->Security->startup($this->Controller); 
    $key = $this->Controller->params['_Token']['key']; 
    $unlocked = ''; 

    $this->Controller->request->data = array(
     'Model' => array('username' => 'nate', 'password' => 'foo', 'valid' => '0'), 
     '_Token' => compact('key', 'unlocked') 
    ); 
    $result = $this->Controller->Security->validatePost($this->Controller); 
    $this->assertFalse($result, 'validatePost passed when fields were missing. %s'); 
} 

Çok daha fazla örnek dosyada:
https://github.com/cakephp/cakephp/blob/master/lib/Cake/Test/Case/Controller/Component/SecurityComponentTest.php

+0

Bu cevap beni düşündürdü Görünümün bir GET'de ne döndüğünü kontrol etme ve düzenlenebilir olmaması gereken alanları içerip içermediğini görme olasılığı. Ardından, Güvenlik bileşeninin etkinleştirildiğini bilerek, güvende olduğumu biliyorum. Ama bence testim hala mantıklı. Çünkü testler, uygulamanızın ne olduğu umurunda değil; Testler sadece sonuçlara dikkat eder. Bu nedenle, düzenleme alanının düzenlenememesi gereken sonuçlar, Güvenlik bileşeninden üretilmiş olsun ya da olmasın (testin umurunda değil) bir hatayla sonuçlanmalıdır. Ama bence bu cevap yeterli. Teşekkür ederim! – Nick