2012-10-03 42 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