如何使用phpunit测试验证表单?

时间:2013-06-11 11:54:31

标签: php unit-testing phpunit

在下面的代码中,反馈表单为3个字段输入内容,例如姓名,电子邮件ID和电子邮件。评论。因此需要使用phpunit测试来验证验证。请帮忙。我是php语法的新手。如何断言&检查valdiation以报告phunit测试。

  if($_POST){
     //echo $sRc;
     //print "<pre>";print_r($_POST);exit;
     require_once(CLASSPATH."/utility.class.php");
     $oUtility      = new utility();
     $sRc           = base64_decode($_COOKIE['Rc_cf']);
     $sEmail            = trim($_POST['emailid']);
     $scomment      = trim($_POST['comment']);
     $syour_name        = trim($_POST['your_name']);
     $sOthereSubject = trim($_POST['subject']);

     $sName         = trim(strip_tags($oUtility->nonxmlcharreplace($_REQUEST['your_name'])));
     $sEmail            = trim(strip_tags($oUtility->nonxmlcharreplace($_REQUEST['emailid'])));
     $sComments     = trim(strip_tags($oUtility->nonxmlcharreplace($_REQUEST['comment'])));

     $iError=0;
     $sErrorMsg="";

     if(strlen($sName)==0){
        $sErrorMsg="Your name cannot be blank.";
        $iError=1;
    }     else if(strlen($sEmail)==0){
        $sErrorMsg="Email address cannot be blank.";
        $iError=1;
    }else if(strlen($sEmail)>0){

        $iValid = $oUtility->isValidEmail($sEmail);
        if($iValid!=1){
             $sErrorMsg="Please enter valid email address.";    
             $iError=1;
         }      
      }
      if(empty($sComments) && strlen($sErrorMsg)==0){
         $sErrorMsg="Comment cannot be blank.";
         $iError=1;
     }

     if(strlen($sErrorMsg)==0){
         require_once(CLASSPATH."feedback.class.php");      
         $oFeedback     = new feedback();

         if($iError==0){
            $aParameters=Array('name'=>$sName,'email'=>$sEmail,'comments'=>$sComments,'cdate'=>'now()',     'is_active'=>1,'cdate'=>'now()','udate'=>'now()');
            $iRes = $oFeedback->addUpdFeedback($aParameters);
            $sInserMsg = 1;
            $sEmail = $sName = $scomment='';

         }

      } 

1 个答案:

答案 0 :(得分:0)

你的方法应该很难测试,因为它太长了。要构建测试,您必须遵循以下三个步骤:

  1. 设置上下文(此处,定义一些输入数据)
  2. 执行函数(这里是一个带有if语句的大函数)
  3. 断言预期的行为发生(这里,验证失败或通过,其他事情发生在你的大函数中)
  4. 单元测试的目标是测试小事,单元事情。因此,在您的情况下,编写测试非常困难,因为在测试上下文中很难定义不同的输入$_POST。这也很难,因为你的功能做了很多不同的事情。

    所以你必须将你的大功能切换成较小的功能,然后逐个测试这个功能。

    例如,类似的东西:

    $errorsArray = $this->validation($_POST);
    if (count($errorsArray) == 0) {
         require_once(CLASSPATH."feedback.class.php");      
         $oFeedback     = new feedback();
         $aParameters=Array('name'=>$sName,'email'=>$sEmail,'comments'=>$sComments,'cdate'=>'now()',     'is_active'=>1,'cdate'=>'now()','udate'=>'now()');
         $iRes = $oFeedback->addUpdFeedback($aParameters);
         $sInserMsg = 1;
         $sEmail = $sName = $
    }
    

    //

    public static function validation($input)
    {
        //Your validation here, return an array of error messages
    }
    

    然后,你将只需编写像这样的somme测试用例:

    public function testValidationOk()
    {
        $input = array('name' => 'John', 'email' => 'john@gmail.com');
        $errorsArray = MyClass::validation($input);
        assertCount(0, $errorsArray);
    }
    
    public function testValidationFailWithoutName()
    {
        $input = array('name' => '', 'email' => 'john@gmail.com');
        $errorsArray = MyClass::validation($input);
        assertCount(1, $errorsArray);
    }
    
    public function testValidationFailWithInvalidEmail()
    {
        $input = array('name' => 'John', 'email' => 'john.com');
        $errorsArray = MyClass::validation($input);
        assertCount(1, $errorsArray);
    }
    

    您的其余功能将在其他测试案例中进行测试。小方法是可测试性,可读性和可维护性的关键。