LoginSignup
2

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-12-09

はじめに

普段、業務で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);
    }

最後に

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

以上

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2