function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
ruparuparuparupa 

プロパティのテストクラスの書き方について

お世話になっております。

プロパティのテストクラスの書き方がわからなく、ご教授願いたく思っております。
public with sharing class TestController {
    public List<SelectOption> objects {
        get {
            if (objects != null) return objects;
            objects = new List<SelectOption>();
            Map<String, Schema.SObjectType> all = Schema.getGlobalDescribe();
            for (String key: all.keySet()) {
                Schema.DescribeSObjectResult sr = all.get(key).getDescribe();
                if (sr.isAccessible() && sr.isUpdateable())
                    objects.add(new SelectOption(key, sr.getLabel()));
            }
            return objects;
        }
        set;
    }
}
<apex:page controller="TestController" >
<apex:form >
  <apex:selectList id="objects"  multiselect="false" >
    <apex:selectOptions id="selectObj" value="{!objects}" />
  </apex:selectList>
</apex:form>
</apex:page>
上記TestControllerのようなクラスのテストクラスはどのように記述すればよいのでしょうか?
下記のように書きますと、1行しかカバーされません。
@isTest
private class TestTestController{
    static testMethod void test01 () {
        TestController c = new TestController();
        c.objects = new List<SelectOption>();
    }
}
初歩的な質問かもしれませんが、色々試してみてもわからなく、質問させていただきました。
どうぞよろしくお願いいたします。
Best Answer chosen by ruparupa
Taiki YoshikawaTaiki Yoshikawa
次のようにするとテストが通ることを確認できました。
@isTest
private class TestTestController{
    static testMethod void test01 () {
        TestController c = new TestController();
        c.objects = new List<SelectOption>();
    }
    
    static testMethod void test02 () {
        TestController cls = new TestController();
        // 次の『System.assertEquals』の処理があるとテストが実行されます。
        System.assertEquals(cls.objects.isEmpty(), false);
    }
}

今回の処理はコントローラをnewしたタイミングで実行されてると思うのですが、テストを通すには一度参照しなければならないみたいです。
System.assertEquals(cls.objects.isEmpty(), false);というようにリストに結果が入っているか確認する処理を追加したところテストが正常に実行されていました。

All Answers

Taiki YoshikawaTaiki Yoshikawa
次のようにするとテストが通ることを確認できました。
@isTest
private class TestTestController{
    static testMethod void test01 () {
        TestController c = new TestController();
        c.objects = new List<SelectOption>();
    }
    
    static testMethod void test02 () {
        TestController cls = new TestController();
        // 次の『System.assertEquals』の処理があるとテストが実行されます。
        System.assertEquals(cls.objects.isEmpty(), false);
    }
}

今回の処理はコントローラをnewしたタイミングで実行されてると思うのですが、テストを通すには一度参照しなければならないみたいです。
System.assertEquals(cls.objects.isEmpty(), false);というようにリストに結果が入っているか確認する処理を追加したところテストが正常に実行されていました。
This was selected as the best answer
ruparuparuparupa
そのように参照すればよかったのですね!
確認できました!誠にありがとうございました。
Taiki YoshikawaTaiki Yoshikawa
解決してよかったです。
今回の処理ですが、次のように実装することも可能です。
public with sharing class TestController {
    
    public List<SelectOption> objects {get; set;}
    
    /**
     * コンストラクタ
     */
    public TestController() {
        // リスト取得
        this.objects = getSelectOption();
    }
    
    /**
     * リスト取得
     */
    private List<SelectOption> getSelectOption() {
        List<SelectOption> objects = new List<SelectOption>();
        Map<String, Schema.SObjectType> all = Schema.getGlobalDescribe();
        for (String key: all.keySet()) {
            Schema.DescribeSObjectResult sr = all.get(key).getDescribe();
            if (sr.isAccessible() && sr.isUpdateable())
                objects.add(new SelectOption(key, sr.getLabel()));
        }
        return objects;
    }
}

コンストラクタはページを表示した際に一度だけ実行されるので初期値をセットするにはコンストラクタ内で実行するのがいいと思います。
この書き方ならSystem.assertEqualsを宣言しなくてもきちんとカバーしていました。

また、テストクラスを作成するときは、『System.assertEquals』をつかって正しい値がセットされているかを確認できます。この判定処理を入れておくと処理が正しく動作している保証になると思います。
ruparuparuparupa
いつもありがとうございます。
プロパティの変数宣言だけして、コンストラクタで変数を初期化する処理を呼び出した方が綺麗ですね。
大変勉強になります。
精進してまいりますので、今後ともどうぞよろしくお願いいたします。