CakePHPでModelのテストが失敗する時の対応

2013-12-07

CakePHPでModelのテストが失敗する時の対応

Composer + CakePHP2 + Composerでinstallしたphpunit という構成でModelのテストが上手くいかなかったのでメモ。   PHPUnitを実行する準備は、下記リンクの内容を参考にしました。 ComposerでインストールしたPHPUnitをCakePHP2のコンソールから利用する方法   ModelクラスにはgetHogeというpublicメソッドを作成し、そのgetHogeメソッドのテストをcake bake testで作成したUserTestに追加しました。

app/Model/User.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
### Test/Case/Model/UserTest.php






User = ClassRegistry::init('User');
}

public function testHoge(){
$this->assertEquals('hoge', $this->User->getHoge());
}

/**
* tearDown method
*
* @return void
*/
public function tearDown() {
unset($this->User);

parent::tearDown();
}

}

    実行してみると、下記の用にsqlエラーが発生して、そもそもテストが実行出来ない。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Welcome to CakePHP v2.4.1 Console
---------------------------------------------------------------
App : app
Path: /app/
---------------------------------------------------------------
CakePHP Test Shell
---------------------------------------------------------------
PHPUnit 3.7.27 by Sebastian Bergmann.

E

Time: 94 ms, Memory: 16.25Mb

There was 1 error:

1) UserTest::testHoge
PDOException: 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 'getHoge' at line 1

/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Model/Datasource/DboSource.php:460
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Model/Datasource/DboSource.php:426
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Model/Datasource/DboSource.php:666
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Model/Datasource/DboSource.php:611
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Model/Model.php:799
/app/Test/Case/Model/UserTest.php:30
/app/Test/Case/Model/UserTest.php:30
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/TestSuite/CakeTestCase.php:84
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/TestSuite/CakeTestRunner.php:63
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/TestSuite/CakeTestSuiteCommand.php:97
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/Command/TestShell.php:275
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/Command/TestShell.php:260
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/Shell.php:435
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/ShellDispatcher.php:210
/Vendor/pear-pear.cakephp.org/CakePHP/Cake/Console/ShellDispatcher.php:68

FAILURES!
Tests: 1, Assertions: 0, Errors: 1.

  色々と調査してみたところ、User.phpがそもそもロード出来ていないのが原因の模様。 ロード出来ていないので、マジックメソッドが呼ばれるが、SQLにはgetHogeなんていう命令は無いからエラーになっていると想像。 ひとまずの応急処置として、APP::usesの箇所を下記のように書き換えれば、動きます。

1
2
//App::uses('User', 'Model');
require APP.'Model/User.php';

とりあえず動くけど、もっとカッコイイ方法があるな・・・絶対に(-_-;) 今度、CakePHPのコードを読んでみよ。 2014-1-12 追記 もっとカッコイイ解決法 =>解決編