2010-11-18 2 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 simpletest tomfoolery. Тест не проходит по методу работы

Вот код, который он якобы erroring на:

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

+0

Было бы легче диагностировать, если бы вы поставили результат var_dump из '$ results' (var_dump выдаст что-то в случае' bool (FALSE) ') – cwallenpoole

+0

Он ничего не выводит на тестовую страницу, если Я пытаюсь выполнить print_r или var_dump $ results. На другой странице он выводит массив, содержащий все записи базы данных для $ test. –

ответ

0

Запрос pdo, очевидно, терпит неудачу, поэтому вы пытаетесь вызвать fetchAll на false.

Я бы уточнил, почему он терпит неудачу.

+0

Я понял это, но он правильно возвращается на другую страницу. Единственное, что я могу думать, это то, что каким-то образом Simpletest делает запрос PDO неудачным. Я не понимаю, почему и как это могло произойти. –

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

Я пошел вперед и сделал что-то похожее на то, что раньше. он возвращает это сообщение: –

+0

Невозможно выполнить запросы, в то время как другие небуферизованные запросы активны. Рассмотрим использование PDOStatement :: fetchAll(). Кроме того, если ваш код будет работать только с mysql, вы можете включить буферизацию запросов, установив атрибут PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY. –

+0

Я попытался установить атрибут, который он перечисляет в конструкторе PDO. Это не помогло. –