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 

エラー「TestMethod として定義されたメソッドは、getContent コールをサポートしていません。」

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

PDFを作成し、メモ&添付ファイルに保存し、メモ&添付ファイルに保存したPDFを表示するページを作成しました。
しかし、テストクラスが上手くいかず、悩んでおります。
下記のコードですと、エラー「TestMethod として定義されたメソッドは、getContent コールをサポートしていません。」と出てしまいます。
自分でも調べてみたのですが、いまいち分からず、どのようなテストメソッドを書くと良いのかご教授いただけますと幸いです。
どうぞ宜しくお願い致します。

AccountPdf.page(PDFページ)
<apex:page standardController="Account" extensions="AccountPdf" renderAs="pdf">
    <body>{!acc.Name}</body>
</apex:page>
AccountPdf.cls(PDFページのコントローラ)
public with sharing class AccountPdf{

    public Account acc { get; set; }
    
    // コンストラクタ
    public AccountPdf(ApexPages.StandardController controller) {

        // パラメータを取得
        ID accd = ApexPages.currentPage().getParameters().get('Id');

        // パラメータ'Id'から取引先を取得
        acc = [SELECT Id, Name
                    FROM Account
                    WHERE Id = :accd
                    LIMIT 1
                ];
        
    }

}

AccountPdfAppended.page(カスタムボタンで/apex/AccountPdfAppended?id=【取引先ID】の様に最初に呼び込むページ)
<apex:page standardController="Account" extensions="AccountPdfAppended">
    <script>
        window.sfdcPage.appendToOnloadQueue(function() { reloadAndClose(); });
        function reloadAndClose() {
            doAction();
        }
    </script>
    <apex:form >
        <apex:actionfunction name="doAction" action="{!doAction}" />
    </apex:form>
    PDFを作成しています...<BR/>
</apex:page>
AccountPdfAppended.cls
public with sharing class AccountPdfAppended{

    private Account acc{get;set;} 

    // コンストラクタ
    public AccountPdfAppended(ApexPages.StandardController controller) {

        // パラメータを取得
        ID accId = ApexPages.currentPage().getParameters().get('Id');

        // パラメータ'Id'から商談を取得
        acc = [SELECT Id, Name
                    FROM Account
                    WHERE Id = :accId
                    LIMIT 1
                ];

    }

    // 戻り呼び出し
    public Pagereference doAction() {

        // PDF作成
        PageReference pageRefPdf = Page.AccountPdf;
        pageRefPdf.getParameters().put('Id', acc.Id);

        // メモ&添付ファイルに保存
        Attachment attachment = new Attachment();
        attachment.Name = 'AccountPDF(' + String.valueOf(Date.today()) +  ').pdf';
        attachment.Body = pageRefPdf.getContent();
        attachment.ParentId = acc.Id;
        insert attachment;
        
        // PDF表示
        PageReference pageRef = new Pagereference('/servlet/servlet.FileDownload?file=' + attachment.Id);
        return pageRef;

    }
    
}

TestAccountPdfAppended.cls(テストクラス)
@isTest
public class TestAccountPdfAppended {

    static testMethod void testSuccess01() {

        // レコード作成
        Account acc = new Account(Name='testName');
        insert acc;
        
        Apexpages.currentPage().getParameters().put('Id', acc.Id);
        AccountPdfAppended c = new AccountPdfAppended(new ApexPages.StandardController(acc));

        c.doAction(); // ←エラー

    }

}
Best Answer chosen by ruparupa
Taiki YoshikawaTaiki Yoshikawa
getContentの処理はコールアウトとして扱われるためテストクラスで実行するとエラーになります。
トランザクション内で DML (Insert / Update / Upsert / Delete) 発行後にコールアウトを行なう事で発生するエラーのはずです。

このエラーに関しては下記が参考になると思います。
http://tyoshikawa1106.hatenablog.com/entry/2015/07/17/125000

回避方法ですが下記のようにテストクラスのときと通常の処理とで切り替えるのはいかがでしょうか
attachment.Body = Test.isRunningTest() ? Blob.valueof('myString') : pageRefPdf.getContent();

テストクラスのときはgetContentを実行しないやりかたです。
(ザックリ書いたので判定処理の書き方などで誤りがあったらすみません。)

All Answers

Taiki YoshikawaTaiki Yoshikawa
getContentの処理はコールアウトとして扱われるためテストクラスで実行するとエラーになります。
トランザクション内で DML (Insert / Update / Upsert / Delete) 発行後にコールアウトを行なう事で発生するエラーのはずです。

このエラーに関しては下記が参考になると思います。
http://tyoshikawa1106.hatenablog.com/entry/2015/07/17/125000

回避方法ですが下記のようにテストクラスのときと通常の処理とで切り替えるのはいかがでしょうか
attachment.Body = Test.isRunningTest() ? Blob.valueof('myString') : pageRefPdf.getContent();

テストクラスのときはgetContentを実行しないやりかたです。
(ザックリ書いたので判定処理の書き方などで誤りがあったらすみません。)
This was selected as the best answer
ruparuparuparupa
Taiki さん

ご回答ありがとうございました。
テストクラスのときは回避するようにすればよかったのですね。
とても勉強になりました。
ありがとうございました。