0

我对phpunit有点陌生,经过数小时的研究,我还没有找到办法。如何使用 phpunit 测试函数 getResults。

函数 getResults 和 getResultsDetails 属于 Result 类。函数 searchUser 属于 User 类。要通过登录,我可以使用用户名和密码在登录对象中调用 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;
   } 

  }
4

1 回答 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));

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

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

如果您有不清楚的地方,请告诉我。

问候!

于 2012-10-03T20:08:53.150 回答