CakePHPで最低限書いた方がいいModelTestの3点セット


はじめに

普段、業務でCakePHPを書いていてコードレビューいただいた際に、modelのテストについて勉強になる知見をいただきました。
CakePHPでは、1テーブル1Modelを作りますが、Modelによっては何もメソッドを書かないものもあると思います。
そんなときに書いた方がいいテストについて知見をここに残します。

概要

CakePHPのModelでは、メソッド以外にValidationやAssociationなどのプログラムを動作させるための設定を行います。
裏を返せば、正しく設定できていない場合は思っている通りに動作してくれません。
そのため、「正しく設定されているかどうか」をテストするために以下の3つのテストを書きたいと思います。

  1. Associationが正しく設定されているか
  2. Behaviorが正しく読み込まれているか
  3. Validationルールが正しく設定されているか

以降、3つのテストを書いていきます。

環境

CakePHP2.10系です。

Associationが正しく設定されているか

Associationが設定されていない場合

    public function testAssociation()
    {
        $actual = $this->Model->getAssociated();
        $this->assertSame($expected, []);
    }

Associationが設定されている場合

    public function testAssociation()
    {
        $actual = $this->Model->getAssociated();
        $this->assertSame($expected, [
            'OtherModel1' => 'belongsTo',
            'OtherModel2' => 'belongsTo',
        ]);
    }

Behaviorが正しく読み込まれているか

$this->Model->Behaviors->loaded()でそのModelが読み込んでいるBehaviorの一覧を取得することができます。

    public function testLoadedBehaviors()
    {
        $expected = [
            'Sample'
        ];
        $actual = $this->Model->Behaviors->loaded();
        $this->assertSame($expected, $actual);
    }

Behavior読み込み時にoptionを指定している場合、上記のテストに追加します。
BehaviorCollectionに定義されている$settingsにて、Behaviorに渡しているoptionにアクセスすることができます。
$settingsが期待されたものかどうかassertします。

    public function testLoadedBehaviors()
    {
        // 上記コード
        // SampleBehaviorに渡している設定が正しいか
        $expected = [
            'Model' => [
                'option1' => 'option1',
            ]
        ];
        $actual = $this->Model->Behaviors->Sample->settings;
        $this->assertSame($expected, $actual['Model']);

Validationルールが正しく設定されているか

validationルールである$validateはpublicなので、 $this->Model->validateでアクセスできます。

public function testValidationRule()
    {
        $expected = [
            'field1' => [
                'rule1' => [
                    'rule' => ['rule1']),
                    'message' => 'message',
                    'required' => true,
                )
            ),
        );
        $actual = $this->Model->validate;
        $this->assertSame($expected, $actual);
    }

最後に

フレームワークを利用する場合は上記のような期待している設定になっているかをテストすることは、期待した動作をするかを確認する上で有効なテストになると思います。

以上