当前位置: 首页 > 知识库问答 >
问题:

我如何使用phpUnit测试多个查询结果

倪灿
2023-03-14

我对phpUnit有点陌生,经过几个小时的研究,我还没有找到一个方法。我如何使用phpUnit测试函数get的结果。

函数getResults和getResultsDetails属于结果类。函数searchUser属于用户类。要获得pass登录,我可以使用用户名和密码在登录对象中调用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);
     }
  }

搜索用户属于用户类类患者{公共函数__construct(){if(! isset($_SESSION)){session_start(); } $

   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个答案

蒙洛华
2023-03-14

为此,您需要使用存根/模拟。基本上你不需要测试搜索用户,也不想要getResult方法单元测试中的getResultDetails方法。所以你必须嘲笑他们,只检查他们是否用适当的参数调用。

您将为此使用 phpunit mock。

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

$someExpectedUser = 123;
$expectedCount = 234;
$expectedResult = array('blablabla');

$object = $this->getMock('YourTestedClass', array('searchUser', 'getResultDetails'));

您现在已经创建了模拟对象。第一个参数是您的类的名称,第二个参数是数组,其中包含您想要模拟的方法的名称(请注意,您没有在第二个参数中指定“getResault”方法——这意味着当您在$对象上调用此方法时——将调用真正的方法)。

下一步是指定搜索用户的行为:

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

getResult详细信息方法相同:

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

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

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

如果你有什么不清楚的地方,请告诉我。

问候!

 类似资料:
  • 我想在我的项目中测试特定的测试类,因为有很多测试类失败,我只想一次测试一个类。 我在以下文件夹中创建了测试类: 因此,我尝试了以下命令,但均无效: = 有什么帮助吗?谢谢

  • 问题内容: 我正在寻找一种快速(真正快速)的方法来测试对hibernate查询的更改。我有一个庞大的应用程序,它具有成千上万个不同的HQL查询(在XML文件中)和100多个映射的类,我不想重新部署整个应用程序,以仅测试对查询的一个微小更改。 好的设置如何使我免于重新部署并启用快速查询检查? 问题答案: 在Intellij IDEA 8.1.3中,选择的机制称为“ Facet”。立即测试HQL查询:

  • 我的actor运行在默认的akka调度程序上,然后调用一个返回Future的方法。我配置了不同的executioncontexts让所有的futures运行(因为它们是阻塞的(由于db调用),并且让actordispatcher只专用于非阻塞actors。想知道这段代码是否可以使用Akka testkit进行测试(继续使用两个执行上下文等)?如果是的话,那么配置测试的方法是什么,让Actor运行在

  • 我一直试图让phpUnit在我的Wordpress主题的自定义PHP类上运行测试,但是无论我如何尝试添加类引用,错误总是相同的: 文件目录不正确。 为了说明这一点,Phpunit运行良好,因为我可以只使用Wordpress调用运行虚拟测试,而且它可以正常工作。例如: 文件结构如下所示: 我的朋友。xml位于WordPress根目录下,我指的是如下测试: 如果有人能告诉我为什么phpunit不能识别

  • 问题内容: 我奋力奔跑名为单个测试方法在文件中使用。我尝试了以下组合: 在每种情况下, 都将执行文件中的 所有 测试方法。如何只选择一种方法呢? 该类的名称为,版本为3.2.8。 问题答案: 以下命令在单个方法上运行测试: 对于新版本的phpunit,它只是:

  • 我正在努力运行一个名为的测试方法,该方法位于文件中。我尝试了以下组合: 在每种情况下,都会执行文件中的所有测试方法。如何只选择一种方法? 该类的名称为,的版本为3.2.8。