2010-11-18 7 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の簡単なおとぎ話。テストが正常に動作しない

は、それはおそらく上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

'$ results'のvar_dumpの結果が何であったかを診断する方が簡単です(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コンストラクタにリストされている属性を設定しようとしました。それは助けになりませんでした。 –

関連する問題