CakePHP で ENUM 型を使うとテストできない?

bake して作った管理画面からの insert には成功する。
(ver: 1.2.0.7962)

test.php で、ENUM 型のフィールドを持つモデルのテストを実行しようとすると、テーブル置き換え(DROP & CREATE)に失敗する様です。

しばらくコードを追いかけてみたところ、それらしき部分が見えてきました。

テーブル作成で使う SQL を組み立てる中で、DboSource#buildColumn が実行されます。ここで、各データベース用のアダプタ(?)で定義される columns をベースにフィールドの型などを検証します。この時に、未定義である ENUM 型のフィールドは除外されてしまいます。

この事が原因で、テストのフィクスチャやコンソールのモデル焼きの中ででエラーが発生し、正常な処理の完遂が行われない、と判断しました。

スキーマ操作周辺で ENUM 型に対応できていないのは、取得した型情報が特殊だからでしょうか。ENUM 型の場合、「ENUM("X", "Y", "Z")」の様に括弧付きで、そのフィールド独自の値が埋め込まれているため、単純な実装では対処できない、としている様に思います。

さて、ENUM 型フィールドを含むテーブル作成ができないだろう事は、分かりました。が、実は、テストは問題なく実行できる事も分かりました。

冒頭で、「テーブル置き換え(DROP & CREATE)に失敗する」と書きましたが、これは実行するかどうかをテストケース内で指定する事ができます。今回の調査をするまで知りませんでしたが、クラスのプロパティとして"var $dropTables = false;"とする事で、テスト時にテーブル自体を作り直す処理が回避されます。

ただ、この回避方法は、環境によっては上手くいかないかもしれません。

CakePHP のテスト機構を詳しく見ていないので、正確な事は把握していませんが、「テスト用テーブルの準備やスキーマ変更のコストがかさむ」結果を招きそうな印象があります。

自分の場合は、テスト用データベースを利用し、テスト対象を実モデルとしてテーブル名を本番と同じものにしているため、本番用のスキーマをそのままテスト用データベースに流し込むだけで済みます。

一方で、記憶が正しければ、クックブック(book.cakephp.org)に従ったテスト環境の場合、テスト用のモデルとテスト用のテーブルが必要なはずです。そうすると、テスト用テーブルのスキーマも必要になるのでは無いでしょうか。

まあ、勘違いによる杞憂かもしれませんが。

結論としては、「ENUM 型も(それなりに)使える」という事だと思います。


公式情報を調べないままの結論なので、激しく間違えている可能性大です。技評の連載で普通に ENUM 型を使っているので、(ちゃんと CakePHP を理解していれば)普通に使えるんだと思います。が、ちゃんと理解していないので、やっぱり、それなりにしか使えないものだと思い込んでおきます。


おまけ:"MySQLのenumフィールドに対応" フォーラム - CakePHP Users in Japan

プロフィール

このブログ記事について

このページは、koshigoeが2009年1月29日 01:18に書いたブログ記事です。

ひとつ前のブログ記事は「MacPorts のインストール済みパッケージ一覧のバックアップとか」です。

次のブログ記事は「MacBookPro が故障したっぽい」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。