2010-08-19 108 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); 
} 

問題是在適配器之間轉義的差異。如果我使用SQLite適配器

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

--- 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 2010-08-19 18:06:12

+1

感謝你們倆。看來適配器有一個getQuoteIdentifierSymbol()方法,所以我可以把它放到一個變量中幷包含在我的斷言中 – 2010-08-19 19:13:13