2010-08-19 1 views
0

나는 PHPUnit을 사용하여 SQL을 리턴하는 클래스 메소드를 테스트한다. 이 클래스들은 어떤 Zend_Db 어댑터와도 작동 할 것이므로 같은 테스트를하고 싶습니다. 테스트 결과는 다음과 같습니다.SQL을 리턴하는 클래스를 단위 테스트하기

public function testEtcGeneratesCorrectSQL() 
{ 
    $model = new ClassBeingTested(); 

    // do some stuff 

    $sql = $model->__toString(); 

    $this->assertEquals('SELECT foo.* FROM foo WHERE bar = 1', $sql); 
} 

문제는 어댑터 간 이스케이프 차이입니다.

--- Expected 
+++ Actual 
@@ @@ 
-SELECT foo.* FROM foo WHERE bar = 1 
+SELECT "foo".* FROM "foo" WHERE "bar" = 1 

그래서 여기 옳은 일이 무엇 : 나는 SQLite는 어댑터를 사용하는 경우

--- Expected 
+++ Actual 
@@ @@ 
-SELECT foo.* FROM foo WHERE bar = 1 
+SELECT `foo`.* FROM `foo` WHERE `bar` = 1 

: 나는 Pdo_Mysql을 사용하여이 검사를 실행할 경우,이 같은 오류가 발생합니다? Zend_Db에서 이스케이프 기능을 해제하는 방법이 있습니까?이 테스트의 목적으로 만 사용할 수 있습니까? 어댑터 유형을 하드 코드 한 다음 예상 출력을 조정하여 조정합니까? 또는 어서션을하기 전에 다른 인용 문자를 제거 할 수 있습니까?

답변

2

를 사용하여 MySQL을위한 때문에, 오히려 하나 따옴표 세트 하드 코딩보다 일정 :

절대적으로 무서운 보이는
$this->assertEquals('SELECT ' . DB_QUOTE . 'foo' . DB_QUOTE . '.* FROM ' 
        . DB_QUOTE . 'foo' . DB_QUOTE . ' WHERE ' 
        . DB_QUOTE . 'bar' . DB_QUOTE . ' = 1'); 

,하지만 당신은 당신이 사용하고있는 드라이버에 따라 DB_QUOTE을 설정하는 경우가 작동합니다.

+0

그런 다음 둘 이상의 드라이버를 테스트하려면 어떻게됩니까? 새로운 PHP 프로세스에서이를 수행해야합니다. 이 아이디어와 함께 가고 싶다면 테스트 할 때 더 많은 유연성을 허용하는 변수를 사용하십시오 ... – ircmaxell

+1

두 분 모두에게 감사드립니다. 어댑터에 getQuoteIdentifierSymbol() 메소드가있는 것 같아서 이것을 변수에 넣고 내 주장에 포함시킬 수있을 것입니다. –