2012-10-03 44 views
0

我有點新的phpunit,經過數小時的研究,我不是很找到辦法。我如何使用phpunit測試函數getResults。我如何測試多個查詢結果與phpunit

函數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屬於用戶類別 類別患者公共職能__construct() 如果(!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

您需要使用stub/mock來做到這一點。基本上你不想在getResult方法單元測試中測試searchUser或getResultDetails方法。所以你必須嘲笑他們,並檢查他們是否用適當的參數進行了調用。

您將使用phpunit模擬。

第一步是設置任何預期值,並建立模擬:

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

然後,所有你需要的是呼叫測試方法,並檢查它是否返回expeced值:

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

請讓我知道,如果有什麼不清楚給你。

問候!

+0

您的評論真的很有幫助。我對原來的問題做了一些改變。但是當我做$ userObj = $ this-> getMock('Users',array('doLogin','searchUser')); $ userObj-> expect($ this-> once()) - >方法('doLogin') - > with('username','password');方法名稱的Expectation失敗等於調用1次時的。方法預計被稱爲1次,實際稱爲0次。 – user332951

+0

是的 - 因爲你指定doLogin應該被精確地調用一次($ this-> once() - 告訴你的模擬,這個方法應該不會少於,但正好一次) - 但你永遠不會調用它(至少我根據您發佈的代碼無法看到它)。 – Cyprian