2013-01-09 81 views
0

我有一個類正在編寫使用SimpleTest的測試。在類中有靜態函數需要傳遞我的SQL連接對象,它駐留在Variables.php中。我該怎麼做呢?將參數傳遞給SimpleTest單元測試

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


    class TestOfMember extends UnitTestCase { 

     function testGetMembersFromEmailAddress() { 

     $this->assertTrue($Member::getMembersFromEmailAddress("[email protected]", $conn)==null); 
     $this->assertTrue($Member::getMembersFromEmailAddress("[email protected]", $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(); 
    } 
} 

}

+0

你是如何做到的? – zerkms

+0

如何將$ conn對象從何處傳遞給測試函數 – FredTheLover

+0

?...... – zerkms

回答

0

你描述的是一個典型的問題。解決它的最簡單方法是使用所謂的模擬對象。這些對象的行爲就像是一個真實的對象,但實際上它們只是一個精簡的外殼。另外:在測試中你可以完全控制它們。

有不同的方法來使用模擬對象,SimpleTest even has it's own implementation。或者你可以使用像mockery這樣的框架。

就你而言,你需要一個數據庫連接對象(DatabaseConnection)和一個query()方法。這將返回一個結果對象(Result),該對象又具有一個fetchAll()方法並可能返回一個數組。

我首先聲明兩個接口,這允許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("[email protected]", $this->mockConn)==null); 
     $this->assertTrue(Member::getMembersFromEmailAddress("[email protected]", $this->mockConn)!=null); 
    } 
} 
相關問題