首页 文章

如何用phpunit测试多个查询结果

提问于
浏览
0

我在phpunit上有点新,经过几个小时的研究后,我找不到方法 . 如何使用phpunit测试函数getResults .

函数getResults和getResultsDetails属于Result类 . 函数searchUser属于User类 . 要获得通行证登录,我可以使用用户名和密码在Login对象中调用doLogin,它将保留在$ _SESSION中

class Result {      
   public function __construct()
   {
       if(!isset($_SESSION)){
           session_start();
       }
       $this->loginObject = new Login();
   }

   public function getResults($fName, $lName)
   {
       $result = searchUser($fName, $lName);
       while ($row = mysql_fetch_assoc($results)) {
          $userIDs = $result['id'] . ',';
       }
       return 
         array(
        'userIDs' => $userIDs,
        'count'   => getResultDetails($userIDs),
        'results' => getResultDetails($userIDs, 0, 500),
        )
   }

如果传入限制和偏移然后返回结果,否则返回所有内容的计数

public function getResultDetails($userIDs, $limit = null, $offset =null)
   {
       if(!$this->beforeFilter()) return "logout";
       //open db connection
       $sql = '';
       if(!$limit && !$offset)
       {
          $sql .= 'SELECT count(*) ';
       } else {
         $sql .= 'SELECT a.info, b.info, d.info ';
       }

       $sql .= 'FROM a ';
       $sql .= 'inner join b on blah blah';
       $sql .= 'inner join d blah blah';
       $sql .= "where d.userID in ($userIDs)";    
       if($limit && $offset)
         $sql .= "LIMIT $limit, $offset";

       return mysql_query($sql);
     }
  }

这是基于firName和lastName的用户搜索 . searchUser属于User类class Patient {public function __construct(){if(!isset($ _ SESSION)){session_start(); } $ this-> loginObject = new Login(); }

public function searchUser($fName, $lName)
   {
        if(!$this->beforeFilter()) return "logout";
        // logic to do search user and return user result mysq_query($sql)
        return userIDs;
   } 

  }

1 回答

  • 1

    您需要使用存根/模拟 . 基本上你不希望在getResult方法单元测试中测试searchUser和getResultDetails方法 . 所以你必须嘲笑它们,然后检查它们是否用适当的参数调用 .

    你将使用phpunit mock .

    第一步是设置任何预期值并构建模拟:

    $someExpectedUser = 123;
    $expectedCount = 234;
    $expectedResult = array('blablabla');
    
    $object = $this->getMock('YourTestedClass', array('searchUser', 'getResultDetails'));
    

    你现在已经创建了模拟对象 . 第一个参数是您的类的名称,第二个参数是您想要模拟的方法的名称(注意您没有在第二个参数中指定“getResult”方法 - 这意味着当您在$ object上调用此方法时 - 真正的一个将被召唤) .

    下一步是指定searchUser的行为:

    $object->expects($this->once())
        ->method('searchUser')
        ->with($fName, $lName)
        ->will($this->returnValue($someExpectedUser));
    

    getResultDetails方法也是如此:

    $object->expects($this->at(1))
        ->method('getResultDetails')
        ->with($someExpectedUser)
        ->will($this->returnValue($expecedCount));
    
    $object->expects($this->at(2))
        ->method('getResultDetails')
        ->with($someExpectedUser, 0, 500)
        ->will($this->returnValue($expecedResults));
    

    然后你需要的只是调用测试方法并检查它是否返回expect值:

    $expectedResult = array(
        'userIDs' => $someExpectedUser,
        'count'   => $expectedCount,
        'results' => $expectedResult
    );
    $result = $object->getResult($fName, $lName);
    $this->assertEquals($expectedResult, $result);
    

    如果您不清楚某些事情,请告诉我 .

    问候!

相关问题