Search code examples
salesforceapex-codevisualforceforce.com

Apex why doesn't the standard controller set the current page when creating the controller (Unit Test)


In Apex Unit tests why doesn't the MyConrtoller myCont = new MyController(StandardContoller); call set the current page?

For instance if I have this page:

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

If my unit tests creates this:

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

Why does ApexPages.currentPage().getParameters().get('id'); fail? I have to do:

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

What is the point of passing in the dbObj to StandardController if it doesn't do anything with it? Is the intent that you send in a blank object and the extenstion uses this object? There doesn't seem to be a lot of documentation for StandardControllers and Unit Testing...

Thanks!


Solution

  • One way to go about this in a test scenario would be something like this:

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

    Now to your question why does getParameters().get('id') fail? You can initiate a StandardController without a record id which would give you a new record and automatically insert the record if you use the default save PageReference.