コントローラーのテスト(カスタム・拡張)

そろそろネタ切れかなと思った今日この頃。
受験ガイドを改めて見てみたら試験範囲のテストのところにこんな記述が。

Visualforce コントローラとコントローラ拡張のテスト方法を説明する

スポンサーリンク

コントローラーのテストも試験範囲

ということで、カスタムコントローラーと拡張コントローラーのテスト方法について述べます。
VisualForceをやっている人であれば、多分一度はコントローラーのテストを記述したことがあると思うんですが、テスト方法の記述など復習の意味で載せておきます。

カスタムコントローラーのテスト

コントローラーといっても、実態はデータとメソッドのあるクラスなので、コントローラーということを意識しなくても、データをセットしてメソッドを呼び出せば、カバレージは通すことができるでしょう。
でも、それでは問題にならないので、VisualForceページと絡めたテスト方法について述べます。

まずは、カスタムコントローラの超シンプルなソース。

AccountCustomCtrl.cls

public with sharing class AccountCustomCtrl {
    public PageReference init() {
        // getパラメータを取得
        String countStr = ApexPages.CurrentPage().getParameters().get('count');

        // パラメータで指定された回数分デバッグログを記載(エラー処理はサボリ)
        Integer cnt = Integer.valueof(countStr);
        for(Integer i = 0; i < cnt; i++){
            System.System.debug('Hoge' + String.valueof(i));
        }
    }
}

コンストラクタは引数なしのため省略。initは起動時に呼ばれるアクションです。
このコントローラーを使用するVisualForceはこんな感じです。

AccountCustomCtrlTest.page

<apex:page controller="AccountCustomCtrl" action="{!init}">
</apex:page>

何も表示していない無なページ・・・。

これをテストにするには、以下のような手順を踏みます。

  1. テストデータ作成(必要であれば)
  2. VisualForceページPageReferenceを取得
  3. PageReferenceにgetパラメータをセットする(必要であれば)
  4. Test.setCurrentPageで先ほど取得したPageReferenceをセットし、現在表示中のページとして設定する
  5. Test.startTestでテスト開始
  6. カスタムコントローラーのコンストラクタ
  7. 任意のメソッドを呼び出してテスト(必要に応じて戻り値にアサートなどをかける)
  8. Test.startTestでテスト終了

以上がカスタムコントローラーテストの手順となりました。

単純に、コントローラーをnew→データをセット→メソッド呼び出しでもカバレージは通せるんですが、上記のコードのように、getパラメータを使用した時のテストが出来ないため、上記手順を覚えておいてください。

テストクラスにすると、このような書き方になります(テストメソッド部分のみを記述しています)

カスタムコントローラのテストメソッド

@IsTest
static void customCtrlTest() {
    // VisualForceのページリファレンスを取得
    PageReference pr = Page.AccountCustomCtrlTest;

    // getパラメータをセット
    pr.getParameters().put('count', '10');
        
    // カレントページにVisalForceページをセット
    Test.setCurrentPage(pr);
    // テスト開始
    Test.startTest();
        
    // カスタムコントローラのコンストラクタ
    AccountCustomCtrl cc = new AccountCustomCtrl();
        
    // あとは拡張コントローラからテストしたいメソッドを呼び出す
    cc.init();
        
    // テスト終了
    Test.stopTest();
}

あと、Test.startTestとTest.stopTestは必須でなくてもいいんですが、ガバナ制限がリセットされるということで、必ずテストの時は囲う癖をつけておいてください。

拡張コントローラーのテスト

続いて、拡張コントローラーのテストです。拡張なので、標準コントローラーとセットで使用されます。
なので、標準コントローラーのもとになるオブジェクトが必要です。

取引先を標準オブジェクトとして拡張コントローラーのApexクラスはこのようになります。

AccountExtensionCtrl.cls

public with sharing class AccountExtensionCtrl {

    private final Account acc;

    public AccountExtensionCtrl(ApexPages.StandardController controller) {
        acc = (Account)controller.getRecord();
    }
    
    public PageReference init() {
        // getパラメータを取得
        String countStr = ApexPages.CurrentPage().getParameters().get('count');

        // パラメータで指定された回数分デバッグログを記載(エラー処理はサボリ)
        Integer cnt = Integer.valueof(countStr);
        for(Integer i = 0; i < cnt; i++){
            System.System.debug('Hey !' + acc.Name);
        }
        return null;
    }

}

標準コントローラーありきの拡張コントローラーなので、必ず引数ApexPages.StandardControllerが存在します
StandardControllerにレコードデータが入っているので取り出す処理をコンストラクタ側で記載しています。

ちなみに、StandardControllerクラスは標準コントローラーのことで、StandardSetControllerと混同しやすいので注意
よくテストで狙われます。StandardSetControllerはページングで使用するクラスです(ここ参照)。

こちらが、拡張コントローラーを使用したVisualForceページ。
AccountExtensionCtrlTest.page

<apex:page standardController="Account" extensions="AccountExtensionCtrl" action="{!init}">
</apex:page>

こちらも無のページですね^^;

拡張コントローラーのテスト、以下のような手順を踏みます。

  1. テストデータ作成(必要であれば)
  2. VisualForceページPageReferenceを取得
  3. PageReferenceにgetパラメータをセットする(必要であれば)
  4. Test.setCurrentPageで先ほど取得したPageReferenceをセットし、現在表示中のページとして設定する
  5. 標準コントローラーのコンストラクタ(作成済みレコードをセットする)
  6. Test.startTestでテスト開始
  7. 拡張コントローラーのコンストラクタ(標準コントローラーを引数とする)
  8. 任意のメソッドを呼び出してテスト(必要に応じて戻り値にアサートなどをかける)
  9. Test.startTestでテスト終了

カスタムコントローラーと違うところは、標準コントローラーをセットする処理が必要なこと。
パラメータの渡し方であったり、ページリファレンスをセットするところはカスタムコントローラーと同じです。

テストクラスはこのように記述します。こちらもテストメソッド部分のみを記述しています。
拡張コントローラのテストメソッド

@IsTest
static void extentionCtrlTest() {
    // 標準コントローラーにセットする取引先データ
    Account a = new Account(Name = 'test');
    insert a;
    
    // VisualForceのページリファレンスを取得
    PageReference pr = Page.AccountCustomCtrlTest;

    // getパラメータをセット
    pr.getParameters().put('count', '10');
    
    // カレントページにVisalForceページをセット
    Test.setCurrentPage(pr);
    
    // StandardControllerのもとになるオブジェクト(Account)をセット
    ApexPages.StandardController sc = new ApexPages.StandardController(a);
    
    // テスト開始
    Test.startTest();
    
    // 拡張コントローラはコンストラクタにStandardControllerを渡す
    AccountExtensionCtrl ec = new AccountExtensionCtrl(sc);
    
    // あとは拡張コントローラからテストしたいメソッドを呼び出す
    ec.init();
    
    // テスト終了
    Test.stopTest();
}

まとめ

  • パラメータの渡しのテストを行うには、Test.setCurrentPageを使用してVisualForceページをセットする
  • 拡張コントローラはApexPages.StandardControllerとセットで使用する

コメント