5

Apexユニットテストでは、なぜMyConrtoller myCont = new MyController(StandardContoller);が実行されないのですか。現在のページを設定しますか?

たとえば、このページがある場合:

<apex:page standardController="DB_Object__c" extensions="MyExtension">
  <apex:form id="detail_list">
    <apex:detail />
    <apex:actionStatus id="readStatus">
    <apex:facet name="start">
        Loading, please wait...
   </apex:facet>
    <apex:facet name="stop"><apex:outputPanel >
        <apex:commandButton action="{!readData}"
            value="Update Data"
            rerender="detail_list"
            status="readStatus"/>
        {!remainingRecords}</apex:outputPanel>
    </apex:facet>
   </apex:actionStatus>
   </apex:form>
</apex:page> 

私の単体テストでこれが作成された場合:

DB_Object__c dbObj = new DB_Object__c();
dbObj.Name = 'test';
dbObj.Setting = 'aSetting';
insert dbObj;
Test.setCurrentPageReference(Page.Demo);
ApexPages.StandardController sc = new ApexPages.StandardController(dbObj);
MyExtension myExt = new MyExtension(sc);

なぜApexPages.currentPage().getParameters().get('id');失敗するのですか?私がしなければなりません:

ApexPages.currentPage().getParameters().put('id',dbObj.id);

それが何もしない場合にdbObjに渡すことのポイントは何ですか?StandardController空白のオブジェクトを送信し、拡張機能がこのオブジェクトを使用するという意図はありますか?StandardControllersとユニットテストに関するドキュメントはあまりないようです...

ありがとう!

4

3 に答える 3

2

テストシナリオでこれを実行する1つの方法は、次のようになります。

// at first you have to create the object
DB_Object__c dbObj = new DB_Object__c();
dbObj.Name = 'test';
dbObj.Setting = 'aSetting';
insert dbObj;

// then you'd call the vf page with the id query paramter
Test.setCurrentPageReference(Page.Demo);
ApexPages.currentPage().getParameters().put('id', dbObj.Id);
dbObj = [Select All, Fields, You, Need From DB_Object__c Where Id = :ApexPages.currentPage().getParamters().get('id')];

// then the StandardController & controller extension get initiated
ApexPages.StandardController sc = new ApexPages.StandardController(dbObj);
MyExtension myExt = new MyExtension(sc);

さて、あなたの質問に、なぜgetParameters().get('id')失敗するのですか?saveレコードIDなしでStandardControllerを開始できます。これにより、新しいレコードが提供され、デフォルトのPageReferenceを使用すると、レコードが自動的に挿入されます。

于 2012-08-15T21:51:33.523 に答える
0

あなたの質問に対する答えは、StandardControllerはvisualforceページに渡されるパラメーターとは何の関係もないということです。これを理解すると、テストでStandardControllerオブジェクトとクエリパラメーターを処理する方法をよりよく理解できます。

ページにアクセスしてブラウザをスローすると、URLからidパラメータを取得してStandardControllerが構築されます。以下は、ページのStandardControllerおよびControllerExtentionsを構築する手順です。

  1. パラメータリストからIdパラメータを取得しますid=ApexPages.currentPage().getParameters().get('id');
  2. 指定されたIDでSobjectをロードしますMy_Object my_Object=[SELECT Id, Name FROM My_Object WHERE Id = :id]
  3. を呼び出して、指定されたオブジェクトを使用して標準コントローラーを構築しますApexPages.StandardController sc = new ApexPages.StandardController(my_Object)
  4. 最後に、すべてのコントローラー拡張を標準コントローラーでインスタンス化します MyExtension myExt = new MyExtension(sc)

このことから、sObjectを渡してStandardControllerオブジェクトをインスタンス化しても、引数として渡されたsObjectのIDを使用してクエリパラメータが自動的に作成されないことがわかります。したがって、テスト目的でクエリパラメータにアクセスする必要がある場合は、それを行ったようにパラメータのリストに明示的に追加する必要がありますApexPages.currentPage().getParameters().put('id', dbObj.Id);

于 2016-08-30T12:28:22.780 に答える
-1

これを使用して、リクエストがAPIソースからのものかどうかを識別しました

String.valueOf(URL.getCurrentRequestUrl()).toLowerCase().contains('services/soap')
于 2012-10-26T00:29:21.240 に答える