2012-08-15 73 views
5

在Apex單元測試爲什麼MyConrtoller myCont = new MyController(StandardContoller);呼叫設置當前頁面?Apex爲什麼標準控制器在創建控制器時未設置當前頁面(單元測試)

舉例來說,如果我有這個頁面:

<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); 

什麼是傳入dbObjStandardController如果它沒有用它做什麼的呢?您是否意圖在空白對象中發送並且擴展使用此對象?似乎沒有很多文件StandardController和單元測試...

謝謝!去這個問題在測試場景中

回答

2

一種方法是這樣的:

// 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')失敗?你可以啓動一個沒有記錄ID的StandardController,它會給你一個新的記錄,如果你使用默認的頁面引用,會自動插入記錄。

+1

儘管這確實起作用,但它並不能真正使它變得理想。我會認爲,如果我傳遞一個非空對象,它會使用該對象來呈現頁面,而不是用它創建一個新對象... – rjbez 2012-08-21 20:10:23

-1

我用這個來識別,如果請求從API源

String.valueOf(URL.getCurrentRequestUrl()).toLowerCase().contains('services/soap') 
+2

我不明白這是如何適用於這個問題? – rjbez 2012-12-27 16:14:30

0

的anwser你的問題是,StandardController無關與傳遞給visualforce頁面的參數來了。當你理解這一點時,你會更好地理解如何在你的測試中處理StandardController對象和查詢參數。

當訪問頁面時拋出瀏覽器,StandardController是通過從url中檢索id參數來構建的。以下可能是構建頁面的StandardController和Controller Extentions的步驟。通過調用ApexPages.StandardController sc = new ApexPages.StandardController(my_Object)

  • 最後,實例化的所有控制器的一些推廣從參數列表

    1. Retrive的Id PARAM id=ApexPages.currentPage().getParameters().get('id');
    2. 裝入的sObject給定ID My_Object my_Object=[SELECT Id, Name FROM My_Object WHERE Id = :id]
    3. 建立的標準控制器與給定對象與標準控制器MyExtension myExt = new MyExtension(sc)

    由此可以注意到,通過傳遞一個sObject來靜態化StandardController對象並不會自動創建一個帶有作爲參數傳遞的sObject的id的查詢參數。因此,如果您的測試目的需要訪問查詢參數,則必須將其顯式添加到參數列表中,如ApexPages.currentPage().getParameters().put('id', dbObj.Id);