Back

Explore Courses Blog Tutorials Interview Questions
0 votes
3 views
in Salesforce by (11.9k points)

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 create 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 extension uses this object? There doesn't seem to be a lot of documentation for StandardControllers and Unit Testing...

Thanks!

1 Answer

0 votes
by (32.1k points)
edited by

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 launch a StandardController without a record ID which would give you a new record and automatically include the record if you use the default save PageReference.

Want to get certified in Salesforce? Here is the Salesforce Online Training you are looking for!

Browse Categories

...