Rails 使いが FuelPHP(1.6) を使ってみた3 Model編

実は環境の立ち上げに結構手間取ったのですが、ここまできてしまえばあとはガツガツコードを書いていくだけです。一番楽しいところです。

(と、おもったんですけどね…)

モデルを作成

まずはモデルから作成してみました。ユーザーのモデルを想定しています。

$ oil g model user name:string
Creating model: /path/to/fuel/app/classes/model/user.php
Creating migration: /path/to/fuel/app/migrations/002_create_users.php

モデルの生成もとても簡単。rails と一緒です。ジェネレータは便利で助かります。

モデルとマイグレーションが生成されましたので、続いてマイグレーションもやってしまいます。

$ oil refine migrate
002_create_users

せっかくなので、私の苦手な(克服しなきゃ…)ユニットテストを書いてみます。

モデルのテスト

テストを動かすには oil test を実行します。

* モデルのテストについてまだ解決できていません!後に更新予定。以下ただの作業過程のログとなります

$ oil test
Tests Running...This may take a few moments.
PHPUnit 3.7.19 by Sebastian Bergmann.
Configuration read from /path/to/fuel/core/phpunit.xml
............................................................... 63 / 346 ( 18%)
............................................................... 126 / 346 ( 36%)
............................................................... 189 / 346 ( 54%)
............................................................... 252 / 346 ( 72%)
............................................................... 315 / 346 ( 91%)
...............................
Time: 9 seconds, Memory: 35.00Mb

何も書いてないので何のテストも実行されませんけど、テストは走りました。

このテストでは FuelPhp 本体のコアのテストも実行されています。自分で書いたテストには @group App のようなアノテーションをつけると oil test  –group=App のように、グループ単位でのテストが実行出来ます。

最近の rails だと、scaffold でテストも生成してくれて、参考にするのにちょうど良かったので、是非 fuelphp でもそうなると、とっつきやすくなるかもしれません。

書き始める前に、テスト用DB の準備をします。CREATE DATABASE foo_test; は手動で行なって、データベースを作成し、config/test/db.php の設定も済ませます。

マイグレーションですが、今度は test 環境の設定でデータベースをマイグレーションする必要があるので FUEL_ENV=”test” と環境変数を設定することで、各環境での動作にさせることができます。

rails も RAILS_ENV で設定できましたね。(-e だったりもするけど)

$ FUEL_ENV="test" oil refine migrate
Performed migrations for app:default:
001_create_articles
002_create_users

ログに環境が返ってくるとわかりやすいのですが、DB を確認してマイグレーションできているかを確認してください。

そして、Model_User のユニットテストを書いてみました。

# fuel/app/tests/user.php
<?php 
/**  
 * @group App 
 */ 
class Test_Model_User extends TestCase 
{
    private $u; 
    public function setUp()
    {         
        $this->u = new Model_User();
    }

    public function test_not_allowed_name_is_empty()
    {
        $this->assertFalse($this->u->save());
    }

    public function test_presence_of_name()
    {
        $this->u->name = 'Rikka Muromi';
        $this->assertTrue($this->u->save());
    }
}

とりあえず、名前(name)はバリデーションで必須にするつもりのテストです。

$ oil test --group=App
There was 1 error:
1) Test_Model_User::test_presence_of_name
Fuel\Core\Database_Exception: SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'name' cannot be null with query: "INSERT INTO `users` (`name`, `created_at`, `updated_at`) VALUES (null, 1375798745, null)"

エラーがでました。名前(name) null を許容していないためです。

自分で設定した覚えはなかったのですが、マイグレーションをみてみると、’null’ => true オプションがない場合は null 許容にならないようです。

ちょっと想定とちがいましたが、バリデーションを実装して、エラーが出ないように期待してみます。

<?php class Model_User extends \Orm\Model {
   protected static $_table_name = 'users';
   protected static $_properties = array(
     'id',
     'name' => array(
      'validation' => array(
        'required'
        ),
      ),
    'created_at',
    'updated_at',
  );

  protected static $_observers = array(
    'Orm\Observer_Validation' => array(
      'before_save', 'before_insert', 'before_update'
    ),
    'Orm\Observer_CreatedAt' => array(
      'events' => array('before_insert'),
      'mysql_timestamp' => false,
    ),
    'Orm\Observer_UpdatedAt' => array(
      'events' => array('before_update'),
      'mysql_timestamp' => false,
    ),
  );
}

モデルの実装はこんな感じにしてみました。name を必須のバリデーションを指定しています。

それから、保存(save)時にバリデーションが実行されるように Observer にも追加しています。

ここを参考にしています。

これで名前がない場合は save() が失敗して false が、入れた場合は true が返り、Assert が成功します。…が、

上と同じエラーが出ました…。なんだかバリデーションが動作していない雰囲気ですがこれ以上の情報がみつからず手詰まりとなってしまいました。

(ソースは眺めてみますが…こうゆうのでハマるとやる気が失せちゃうんだよなぁ…)

何はともあれ、とりあえずモデルのテストは書けたので、所々の問題が解決すれば(すれば…!)これでTDDはできそうです。

結局上記の問題が解決できず、ちょっと投げ出し気味なのですが…。

Rails とどっちが難しいかと聞かれたらちょっとバイアスがあるかもしれませんが、FuelPHP のほうが難しいような気がします、というか Rails がヌルすぎる…!?

言語も思想も違うのでどっちがどっちということもないですが、正直 Rails のほうがとっつきやすいとおもいます…。

(変更が激しいし、RAILS4 で TurboLink とかちょっとアレなのが標準になって疑問なところもありますが)

なんとかこれに懲りずに、もうちょっと浸かってみたいと思います。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする