Тестовый пример вызова phpunit ajax с использованием Zend - PullRequest
0 голосов
/ 09 марта 2011

Как мы можем проверить вызов ajax, используя phpunit zend.

Это мой ajax-вызов в контроллере

public function indexAction()
{   
    if ( $this->getRequest()->isPost() )
    {      

        if (self::isAjax()) {

            $name = $this->getRequest()->getParam('name');
            $email = $this->getRequest()->getParam('email');            


             $u = new admin_Model_User();
             $u->email = $email;
             $u->name = $name;             
             $u->save();

            if(!empty($u->id)) $msg = "Record Successfully Added";
            else $msg = "Records could not be added";


            $this->results[] = array('status'=>true, 'msg'=>$msg);


            echo $this->_helper->json($this->results);
        } else {
        echo "none-Ajax Request";
    }
    }else {

    echo "Request not post";
}
}

private function isAjax() {
    return (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');
}

вот мой тестовый пример

    class AjaxjsonControllerTest extends ControllerTestCase
    {
    // testing not post area
    public function testIndexAction() {
        $this->dispatch('/ajaxjson');
        $this->assertModule('admin');
        $this->assertController('Ajaxjson');
        $this->assertAction('index');
    }
// testing not ajax request
public function testIndexNonajaxAction() {
        $request = $this->getRequest();  
      $request->setMethod('POST');
      $request->setPost(array(
        'name' => 'name bar',
        'email' => 'email x',
      ));

        $this->dispatch('/ajaxjson');
        $this->assertModule('admin');
        $this->assertController('Ajaxjson');
        $this->assertAction('index');
    }

        public function testPostAction() {
              $request = $this->getRequest();
              //$request->setHeader('X_REQUESTED_WITH','XMLHttpRequest');
              $request->setHeader('HTTP_X_REQUESTED_WITH','XMLHttpRequest');

              $request->setMethod('POST');
              $request->setPost(array(
                'name' => 'name bar',
                'email' => 'email x',
              ));

              $this->dispatch('/ajaxjson');
            }

    }

но это не работает. У кого-нибудь есть идеи?

1 Ответ

1 голос
/ 10 марта 2011

Во-первых, PHPUnit обычно запускается через консоль.Когда я проверяю переменную $ _SERVER через тесты, которые я запускаю, она сильно отличается от того, что можно найти на веб-сервере.В вашем методе isAjax вы должны использовать что-то вроде:

$this->getRequest()->getHeaders() // array of headers
$this->getRequest()->getHeader('HTTP_X_REQUESTED_WITH'); //specific header

Если вы действительно, действительно хотите использовать $ _SERVER в своем контроллере, то почему бы просто не установить переменную $ _SERVER в тесте?

$_SERVER['HTTP_X_REQUESTED_WITH'] = 'XMLHttpRequest';
      $request->setMethod('POST');
          $request->setPost(array(
            'name' => 'name bar',
            'email' => 'email x',
          ));
$this->dispatch('/ajaxjson');

Во-вторых, и что более важно, вы на самом деле ничего не тестируете ... Вы должны иметь утверждение в методе теста.По сути, вы можете использовать

   $this->assertController('ajaxjson');
   $this->assertAction('index');

Но вам действительно нужно настроить несколько тестов для этого действия.Тест для

  1. , когда запрос не является сообщением
  2. Когда запрос не является ajax
  3. , когда пользователь сохраняется
  4. , когда пользователь не являетсясохранено
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...