2012-04-11 12 views
4

私は、fixtureとTestモデルを作成するためにcake bakeコマンドを使用しています。私は私のモデルの1つでそれを成功させましたが、私は別のもので問題を抱えています。テストDB cakePHPテストの選択方法

なぜ私はすでに定義したテストの代わりにデフォルトのDBで作業しようとしています。これはテストした最初のモデルで使用されたものです。

両方のテストモデルはうまく動作し、この2つはケーキベークで作成されており、まったく同じように見えます。

二人とも自分のフィクスチャクラスでこれを持っている:

public $import = array('records' => true, 'connection' => 'test'); 

テストは、私のテストデータベースへの接続を定義します。 何が問題なのですか?

私は何か変わった実験をしています。私のテストモデルでは、複数の代わりにシングルを使用する場合、デフォルトのDBで動作しますBUTこれを複数に変更すると、テスト用のデータベースで動作します。 (ただし、モデルからメソッドを呼び出すことはできません。find()などのメソッドだけを呼び出すことができます)。例えば

public function setUp() { 
    parent::setUp(); 

    //uses the default DB (i dont know why) 
    $this->Post = ClassRegistry::init('Post');   
    print_r($this->User->find('all')); 

    $this->Post->updatePostsStatus(1); //works well 

    //uses the default Test Database (i dont know why either) 
    $this->Post = ClassRegistry::init('Posts');   
    print_r($this->User->find('all')); 

    $this->Post->updatePostsStatus(1); //doesn't work. No function found. 
    /*SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'updatePostsStatus' at line 1*/ 

} 

感謝。

私はそれを更新しました。

LAST UPDATE、その溶液

問題は、ポストモデルコンストラクタの悪い初期化しました。 複数形の使用は関係ありませんでした。存在しないモデルを使用するようなものです。それは常にテストデータベースを取得します。 コンストラクタの良い初期化のための答えはここにある: How to override model's constructor correctly in CakePHP

+0

'Default'データベースに添付されている' Post'というクラスがレジストリにあります。これは以前にインスタンス化されている可能性があります。あなたが 'Posts'を呼び出そうとすると、Cakeはレジストリ内でその名前のクラスを見つけられませんので、新しいクラスを作成します。あなたがテストスイートに入っているので、新しいクラス' Posts' 'test'です – luchomolina

+0

それでは、私に何をお勧めしますか? – Alvaro

+0

申し訳ありませんが、私も紛失しています。しかし、1つのことは... 'public $ import = array( 'Post')'のようなレコードをインポートしようとしましたか? 'test' dbを自動的に付け加えるべきです。 – luchomolina

答えて

1

MySQLエラーのその種は、CakePHPに誤解を招く非常にすることができます。

実際に問題があるのは、$this->Post->updatePostsStatus(1);です。具体的には、PostモデルかupdatePostsStatus()投稿モデルの方法が存在しません。

基本的には、この行にタイプミスがあります。メソッド名を確認してください。updatePostStatusである必要がありますか?あなたは、CakePHPでモデルに未定義のメソッドを呼び出そうと代わりの方法を報告するのが発見されていません(投稿には複数?)


が何らかの理由で、、CakePHPのの「automagicnessは」で蹴り、奇妙なことに、それはまったくのメソッド名をそのままMySQLにプッシュしようとします。基本的には

、CakePHPは $this->Post->updatePostsStatus(1);方法を見つけることができないので、実際に私たちは、この奇妙なデータベース・エラーを見ている理由です updatePostsStatusすなわち mysql_query("updatePostsStatus');のMySQLのクエリを実行しようとしています。メソッド名のスペルを誤っている可能性があります。


メソッド名はまだ問題ではない場合、それは正しくインスタンス化されていないPostsモデルとは何かです。あなたはすべての名前が正しい限り、それは疑わしいと思うが。データベースの問題ではなく、未知のクラスメソッドを自動的に処理するケーキな方法です。

+0

こんにちはDunhamzzz、マークストーリーと話した後、私はすでに答えを得ているので、私は質問を更新するつもりです!とにかく! ポストモデルのコンストラクタが正しく初期化されていないという問題がありました。あなたはここで解決策を見つけることができます:http://stackoverflow.com/questions/10153841/how-to-overriding-a-constructor-correctly-at-cakephp-2-0 – Alvaro

+1

クール、それは私が言ったようなものです、ケーキ'updatePostsStatus()'メソッドをPostモデルが正しくインスタンス化されていないので呼び出すことができませんでした。 – Dunhamzzz

関連する問題