Visualforceページコントローラのテストの書き方(拡張コントローラー/カスタムコントローラ・GETパラメータ付き)

      2020/09/04

最近Apexを使って色々と書いているのだが、Visualforceページでダッシュボード的なものを作ったときのテストの書き方がよくわからなかった。

ダッシュボードはパラメータを受け取ってそのパラメータによって表示内容を変更するようなもの。

テストコードはこんな感じ。

pageRef.getParameters().put('id', 'a1O1000000xxxxx');これをつけると、VisualforceページにURLパラメータをつけた状態になる。

[code]
@isTest
public class 拡張コントローラー名_Test {
@isTest(SeeAllData=true) // 使うデータが複雑な為、予めデータを投入しておいてテストしていますが、そうでない場合はデータ投入してそれを使うべき
  static void testMethod1() {
  // 1.コントローラを利用するvisualforceページをテスト実行時の画面として設定
    PageReference pageRef = Page.ページ名; //ページ名にはVisualforceページのページ名を入れる
    pageRef.getParameters().put('id', 'a1O1000000xxxxx'); //今回はカスタムオブジェクトのIDをURLに入れて使っていたのでそのデータのパラメータをIDに指定して入れた
    Test.setCurrentPage(pageRef);

  // 2.画面で操作するオブジェクトを生成
    カスタムオブジェクト名__c obj = new カスタムオブジェクト名__c();
    obj = [SELECT Id,Name,OwnerID,Visualforceページの表示に必要な項目をここで指定 FROM MyReport__c WHERE ID = 'a1O1000000xxxxx'];

  // 3.標準コントローラを生成
  // オブジェクトを渡してインスタンス化する
    ApexPages.StandardController stdController = new ApexPages.StandardController (obj);

  // 4.コントローラ拡張を生成
  // 標準コントローラを渡してインスタンス化する
  拡張コントローラー名 extController = new 拡張コントローラー名(stdController);
  }
}
[/code]

これで拡張コントローラのテストが通りました。

カスタムコントローラの場合

Visualforceページ名を:vpage
カスタムコントローラクラス名を:cclass

とする場合。ページ生成してクラスのインスタンスを作成すれば表示された時の処理が走るようになる。

[code]

@isTest
static void testMethod() {
  PageReference pageRef = Page.vpage;
  cclass cc = new cclass();
}

[/code]

GETパラメータを付ける場合は

[code]
@isTest
static void testMethod() {
  PageReference pageRef = Page.vpage;
  ApexPages.currentPage().getParameters().put('パラメータ名1','値1');
  ApexPages.currentPage().getParameters().put('パラメータ名2','値2');//複数ある場合はこうやって続ければ良い
  cclass cc = new cclass();
}
[/code]

カスタムコントローラでPageReferenceをテストする場合

[code]
@isTest<br />public class テストクラス名 {<br />	@isTest<br />	static void testMethod1() {<br />        //ページの設定<br />        PageReference pageRef = Page.Visualforce page名;<br />        pageRef.getParameters().put('パラメータ名','パラメータvalue');<br />        System.Test.setCurrentPage(pageRef);<br />        カスタムクラス名 cc = new カスタムクラス名();<br />        cc.メソッド名();<br />    }<br />}
[/code]

Salesforce等に関するnote書いてます

https://note.com/geeorgey

おすすめ記事一覧

 - Salesforce