2012-08-15 18 views
5

En las pruebas de Apex Unit, por qué no MyConrtoller myCont = new MyController (StandardContoller); llamar establecer la página actual?Apex ¿por qué el controlador estándar no establece la página actual al crear el controlador (Prueba de unidad)

Por ejemplo, si tengo esta página:

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

Si mis pruebas de unidad crea esto:

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

¿Por qué fracasan ApexPages.currentPage().getParameters().get('id');? Tengo que hacer:

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

¿Cuál es el punto de paso en el dbObj a StandardController si no se hace nada con él? ¿La intención es enviar un objeto en blanco y la extensión usa este objeto? No parece haber mucha documentación para StandardControllers y Unit Testing ...

¡Gracias!

Respuesta

2

Una forma de hacer esto en un escenario de prueba sería algo como esto:

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

Ahora a su pregunta ¿por qué fracasan getParameters().get('id')? Puede iniciar un StandardController sin una identificación de registro que le proporcione un nuevo registro e inserte automáticamente el registro si usa la referencia de página predeterminada save.

+1

Aunque esto funciona, realmente no lo hace ideal. Pensaría que si paso un objeto no nulo usaría ese objeto para representar la página en lugar de crear un nuevo objeto con ella ... – rjbez

-1

He utilizado este para identificar si la solicitud proviene de una fuente API

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

¿No veo cómo esto se aplica a esta pregunta? – rjbez

0

El anwser a su pregunta es que el StandardController no tiene nada que ver con los parámetros pasados ​​a la página Visualforce. Cuando comprenda esto, comprenderá mejor cómo tratar el objeto StandardController y los parámetros de consulta en sus Pruebas.

Cuando se accede a la página tira el navegador, el StandardController se construye recuperando el param del id de la url. Los siguientes podrían ser los pasos para construir StandardController y Extentions Controller de la página.

  1. Recupera la PARAM Id de la lista de parámetros id=ApexPages.currentPage().getParameters().get('id');
  2. Cargar la Sobject con el dado Id My_Object my_Object=[SELECT Id, Name FROM My_Object WHERE Id = :id]
  3. Construir el controlador estándar con el objeto dado llamando ApexPages.StandardController sc = new ApexPages.StandardController(my_Object)
  4. Finalmente, instanciar todas las extensiones de controlador con el controlador estándar MyExtension myExt = new MyExtension(sc).

De esto, puede observar que al instalar el objeto StandardController pasando un sObject no se crea automáticamente un parámetro de consulta con el id del sObject pasado como argumento. Entonces, si para su propósito de prueba necesita acceder a los parámetros de consulta, debe agregarlo explícitamente a la lista de parámetros como lo hizo ApexPages.currentPage().getParameters().put('id', dbObj.Id);.

Cuestiones relacionadas