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 モックを使用します。

最初のステップは、期待される値を設定し、モックを作成することです:

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

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

これでモック オブジェクトが作成されました。最初の引数はクラスの名前で、2 番目の引数はモックするメソッドの名前の配列です (2 番目の引数で "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 に答える