2010-11-18 60 views
0

我一直在爲一個簡單的Datamapper類寫一個測試,並且我知道該方法正在工作,但是測試失敗並且給我錯誤「Fatal error: Call to a member function fetchAll() on a non-object in C:\xampp\htdocs\Call log\tests\model_tests.php on line 13.」顯然,這不可能是對,因爲我可以驗證該方法的工作原理。PHP最簡單的tomfoolery。測試不通過工作方法

這裏是它理應示數的代碼:

function all() { 
    $calls = $this->pdo->query('SELECT * from calls'); 
    return $calls->fetchAll(); 
} 

這裏是我的測試代碼:

class TestOfCallMapper extends UnitTestCase { 
    function testOfReturnsAll() { 
     $this->createSchema(); 
     $mapper = Callmapper::getInstance(); 
     $results = $mapper->all(); 
     print_r($results); 
    } 

    private function createSchema() { 
     $mapper = CallMapper::getInstance(); 
     $mapper->pdo->exec(file_get_contents('../database/create_schema.sql')); 
    } 

    private function destroySchema() { 
     $mapper = CallMapper::getInstance(); 
     $mapper->pdo->exec(file_get_contents('../database/destroy_schema.sql')); 
    } 
} 

$test = new TestOfCallMapper('Test of CallMapper Methods'); 
$test->run(new HTMLReporter()); 

如果我這樣做,它工作得很好:

$mapper = CallMapper::getInstance(); 
    $test = $mapper->all(); 
    print_r($test->fetchAll()); 
+0

請的var_dump()或print_r的()$測試,看看它是否真的是一個對象。 – oezi 2010-11-18 17:57:36

+0

如果你把'$ results'的var_dump的結果是(var_dump會在'bool(FALSE)'的情況下輸出一些東西) – cwallenpoole 2010-11-18 18:05:25

+0

它會更容易診斷它不會在測試頁面輸出任何東西if我嘗試print_r或var_dump $結果。在另一頁上,它輸出一個包含$ test的所有數據庫條目的數組。 – 2010-11-18 18:11:22

回答

0

pdo查詢明顯失敗,因此您試圖在false上調用fetchAll。

我會檢查它失敗的原因。

+0

我意識到這一點,但它在另一頁上正確返回。我能想到的唯一事情就是不知何故Simpletest使PDO查詢失敗。我不明白爲什麼或如何發生這種情況。 – 2010-11-18 18:20:39

1

您的PDO查詢返回false,因此它不是PDO的實例,而是一個布爾值,請嘗試這樣!

function all() { 
    $calls = $this->pdo->query('SELECT * from calls'); 
    if($calls === false) 
    { 
     throw new Exception("Unable to perform query"); 
    } 
    return $calls->fetchAll(); 
} 

,然後在您TestOfCallMapper,你可以這樣做:

function testOfReturnsAll() 
{ 
     $this->createSchema(); 

     $mapper = Callmapper::getInstance(); 
     try 
     { 
      $results = $mapper->all(); 
     }catch(Exception $e) 
     { 
      //Some Logging for $e->getMessage(); 
      return; 
     } 
     //Use $results here   
} 
+0

我繼續前進,並做了類似的事情。它會返回以下消息: – 2010-11-18 19:53:29

+0

無法在其他未緩衝查詢處於活動狀態時執行查詢。考慮使用PDOStatement :: fetchAll()。另外,如果你的代碼只是針對mysql運行,你可以通過設置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY屬性來啓用查詢緩衝。 – 2010-11-18 19:53:56

+0

我試着設置它在PDO構造函數中列出的屬性。它沒有幫助。 – 2010-11-18 19:54:32