2012-08-15 7 views
5

W testach Apex Unit dlaczego MyConrtoller myCont = new MyController (StandardContoller); zadzwoń ustaw aktualną stronę?Apex dlaczego standardowy kontroler nie ustawił bieżącej strony podczas tworzenia kontrolera (test jednostki)

Na przykład jeśli mam stronę:

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

Jeśli moje testy jednostkowe tworzy to:

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

Dlaczego ApexPages.currentPage().getParameters().get('id'); nie? Muszę zrobić:

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

Jaki jest sens przechodzenia w dbObj do StandardController jeśli nie nic z nim zrobić? Czy intencja, którą wysyłasz, jest pustym obiektem, a ekstencja używa tego obiektu? Wydaje się, że nie ma dużo dokumentacji dla StandardControllers i testów jednostkowych ...

Dzięki!

Odpowiedz

2

Jednym ze sposobów, aby przejść o tym w scenariuszu testowym będzie coś takiego:

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

Teraz na pytanie dlaczego getParameters().get('id') nie? Możesz zainicjować StandardController bez identyfikatora rekordu, który dałby nowy rekord i automatycznie wstawił rekord, jeśli użyjesz domyślnej wersji.

+1

Chociaż to działa, tak naprawdę nie czyni go idealnym. Sądzę, że jeśli przekażę obiekt niepustny, użyłbym tego obiektu do renderowania strony, zamiast tworzenia z nią nowego obiektu ... – rjbez

-1

użyłem to do określenia, czy żądanie pochodzi od źródła API

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

Nie widzę, w jaki sposób dotyczy to tego pytania? – rjbez

0

anwser na Twoje pytanie jest, że StandardController nie ma nic wspólnego z parametrów przekazywanych do strony visualforce. Kiedy to zrozumiesz, lepiej zrozumiesz, jak radzić sobie z obiektem obiektu StandardController i parametrami zapytania w testach.

Gdy strona jest dostępna, wyrzuć przeglądarkę, StandardController jest budowany przez pobranie parametru id z adresu URL. Poniższe czynności mogą być krokiem do budowania StandardController i Extend Controller strony.

  1. sprowadzaniu param identyfikator z listy parametrów id=ApexPages.currentPage().getParameters().get('id');
  2. Załaduj Sobject z podanym Id My_Object my_Object=[SELECT Id, Name FROM My_Object WHERE Id = :id]
  3. Budowanie standardowy sterownik z danego obiektu poprzez wywołanie ApexPages.StandardController sc = new ApexPages.StandardController(my_Object)
  4. Wreszcie instanciate wszystkie extentions kontrolera ze standardowym kontrolerem MyExtension myExt = new MyExtension(sc).

Z tego można zauważyć, że instaciating obiektu StandardController przez przekazanie sObject nie tworzy automatycznie parametru zapytania o id przekazanego jako argument sObject. Jeśli więc do celów testowych musisz uzyskać dostęp do parametrów zapytania, musisz dodać go jawnie do listy parametrów, tak jak to zrobiłeś ApexPages.currentPage().getParameters().put('id', dbObj.Id);.

Powiązane problemy