0

SimpleTest を使用してテストを書いているクラスがあります。クラスには、Variables.php にある SQL 接続オブジェクトを渡す必要がある静的関数があります。どうすればいいですか?

<?
   require_once('../Variables.php');


   class TestOfMember extends UnitTestCase {

      function testGetMembersFromEmailAddress() {

         $this->assertTrue($Member::getMembersFromEmailAddress("xxx@xxx.com", $conn)==null);
         $this->assertTrue($Member::getMembersFromEmailAddress("xxx@gmail.com", $conn)!=null);
      }
    }

?>


class Member {
public static function getMembersFromEmailAddress($emailAddress, $conn) {

    $args = array();
    $args[] = $conn;

    try {
        $result = $conn->query("SELECT * FROM members WHERE Members_Email ='" . $emailAddress . "'");
        $members = $result->fetchAll(PDO::FETCH_CLASS, 'Member', $args);

        return $members;
    } catch (PDOException $e) {
        echo $e->getMessage();
    }
}

}

4

1 に答える 1

0

あなたが説明するのは典型的な問題です。これを解決する最も簡単な方法は、いわゆるモック オブジェクトを使用することです。これらのオブジェクトは、実際のオブジェクトのように動作しますが、実際には単なる薄いシェルです。さらに、テストでそれらを完全に制御できます。

モック オブジェクトを使用するにはさまざまな方法があり、SimpleTest には独自の実装もありますまたは、 mockeryのようなフレームワークを使用することもできます。

あなたの場合、メソッドを持つデータベース接続オブジェクト ( DatabaseConnection)が必要query()です。これにより、結果オブジェクト ( Result) が返されます。このオブジェクトにはfetchAll()メソッドがあり、おそらく配列が返されます。

最初に 2 つのインターフェースを宣言します。これにより、SimpleTest がメソッドをモックできるようになります。それらのクラスをすでに宣言している場合は、それらを使用しMock::generate()てモッククラスを生成できます。

interface DatabaseConnection
{
    function query();
}

interface Result
{
    function fetchAll();
}

//this call generates a class called 'MockDatabaseConnection'
//with the same interface as 'DatabaseConnection'
Mock::generate('DatabaseConnection');
Mock::generate('Result');

class TestOfMember extends UnitTestCase
{
   //this method gets called before each test method, it sets up each test
   function setUp() {
       $mockResult = new MockResult();
       //here I just return a string, but you could return a Member object as well
       $mockResult->returns('fetchAll', array("Member 1", "Member 2", "Member 3"));
       $this->mockConn = new MockDatabaseConnection();
       $this->mockConn->returns('query', $mockResult);
   }

   function testGetMembersFromEmailAddress() {
       $conn = new MockDatabaseConnection();

       //here you could now check for the mocked values "Member 1", "Member 2" ...
       $this->assertTrue(Member::getMembersFromEmailAddress("xxx@xxx.com", $this->mockConn)==null);
       $this->assertTrue(Member::getMembersFromEmailAddress("xxx@gmail.com", $this->mockConn)!=null);
   }
}
于 2013-01-10T00:44:19.510 に答える