1

在下面的代码中,反馈表单需要输入 3 个字段,例如姓名、电子邮件 ID 和评论。所以验证需要使用 phpunit test 进行测试。请帮忙。我完全是 php 语法的新手。如何断言和检查验证以在 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='';

         }

      } 
4

1 回答 1

1

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

  1. 设置上下文(在这里,定义一些输入数据)
  2. 执行函数(这里是一个中间有 if 语句的大函数)
  3. 断言发生了预期的行为(这里,验证失败或通过,其他事情发生在你的大函数中)

单元测试的目标是测试小事,单元事。因此,在您的情况下,编写测试非常困难,因为很难$_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
}

然后,您只需要编写一些像这样的测试用例:

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);
}

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

于 2013-06-11T14:29:17.123 回答