2013-01-09 5 views
0

SimpleTest를 사용하여 테스트를 작성하는 클래스가 있습니다. Variables.php에있는 SQL 연결 객체를 전달해야하는 클래스에 정적 함수가 있습니다. 어떻게해야합니까?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과 같은 프레임 워크를 사용할 수도 있습니다.

귀하의 경우 query() 방법을 사용하는 데이터베이스 연결 개체 (DatabaseConnection)가 필요합니다. 그러면 결과 객체 (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); 
    } 
}