2017-07-18 2 views
0

Langer SFDC-Administrator, der zum ersten Mal in APEX eintaucht.Schreibgerät-Test für benutzerdefinierten Salesforce-Controller mit AggregateResults-Funktion

Ich habe einen benutzerdefinierten Controller für eine Dashboard-Komponente (Visualforce-Seite) erstellt. Controller funktioniert, benötigt aber Unit-Tests, um in Produktion zu gehen (dont ask - org leidet unter geringer Abdeckung). Hier

ist die Steuerung:

public with sharing class retrieveMRR { 

public Summary[] Summaries { get; set; } 

public retrieveMRR() { 
    AggregateResult[] results = 
     [SELECT SUM(Opportunity.MRR_Projected_EOM__c) MRRtm, 
SUM(Opportunity.Billing_MRR_Last_Month__c) MRRlm, 
SUM(Opportunity.Billing_MRR_M_minus2__c) MRRlm2, 
SUM(Opportunity.Billing_MRR_Last_Month_Pilot_Change__c) chgPlusPilotlm , 
SUM(Opportunity.Billing_MRR_Last_Month_Pilot_Change2__c) chgMinusPilotlm , 
SUM(Opportunity.Billing_MRR_Last_Month_NPilot_Change__c) chgPlusNPilotlm , 
SUM(Opportunity.Billing_MRR_Last_Month_NPilot_Change2__c) chgMinusNPilotlm FROM Opportunity ]; 
    Summaries = new List<Summary>(); 
    for (AggregateResult ar : results) { 
    Summaries.add(new Summary(ar)); 


} 

} 
public class Summary { 
    public Decimal MRRtm { get; private set; } 
    public Decimal MRRlm { get; private set; } 
    public Decimal MRRlm2 { get; private set; } 
    public Decimal chgPlusPilotlm { get; private set; } 
    public Decimal chgMinusPilotlm { get; private set; } 
    public Decimal chgPlusNPilotlm { get; private set; } 
    public Decimal chgMinusNPilotlm { get; private set; } 

    public Summary(AggregateResult ar) { 
    MRRtm = (Decimal) ar.get('MRRtm'); 
    MRRlm = (Decimal) ar.get('MRRlm'); 
    MRRlm2 = (Decimal) ar.get('MRRlm2'); 
    chgPlusPilotlm = (Decimal) ar.get('chgPlusPilotlm'); 
    chgMinusPilotlm = (Decimal) ar.get('chgMinusPilotlm'); 
    chgPlusNPilotlm = (Decimal) ar.get('chgPlusNPilotlm'); 
    chgMinusNPilotlm = (Decimal) ar.get('chgMinusNPilotlm'); 

    } 
    } 
} 

Hier ist die Visual Seite ggf.

<apex:page controller="retrieveMRR"> 
<apex:pageBlock title="MRR"> 
    <apex:pageBlockSection columns="3" > 
    <apex:repeat value="{!Summaries}" var="summary"> 

    <apex:outputText style="font-weight:800; font-size:16px" value="Month"></apex:outputText> 
    <apex:outputText style="font-weight:800; font-size:16px" value="Value"></apex:outputText> 
    <apex:outputText style="font-weight:800; font-size:16px" value="+ New/- Lost"></apex:outputText> 


    <apex:outputText style="font-weight:800" value="{0,date,MMMM YYYY} (actual)"><apex:param value="{!TODAY()-60}" /> </apex:outputText> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="{0, number, currency}"><apex:param value="{!summary.MRRlm2}" /></apex:outputText> </apex:outputLink> 
    <apex:outputText value=""></apex:outputText> 

    <apex:outputText style="font-style:italic" value=" change"><apex:param value="{!TODAY()}" /> </apex:outputText> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="{0, number, currency}"><apex:param value="{!summary.MRRlm-summary.MRRlm2}" /></apex:outputText> </apex:outputLink> 
    <apex:outputText value="{0, number, currency}"><apex:param value="{!null}" /></apex:outputText> 

    <apex:outputText style="font-weight:400 ; align: center" value="Pilot"> </apex:outputText> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="{0, number, currency}"><apex:param value="{!summary.chgPlusPilotlm+summary.chgMinusPilotlm}" /></apex:outputText></apex:outputLink> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="+{0, number, $###,###,##0}/{1, number, $###,###,##0}"> 
    <apex:param value="{!summary.chgPlusPilotlm}" /> 
    <apex:param value="{!summary.chgMinusPilotlm}" /> </apex:outputText></apex:outputLink> 

    <apex:outputText style="font-weight:400 ; align: center" value="Non-Pilot"> </apex:outputText> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="{0, number, currency}"><apex:param value="{!summary.chgPlusNPilotlm+summary.chgMinusNPilotlm}" /></apex:outputText></apex:outputLink> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="+{0, number, $###,###,##0}/{1, number, $###,###,##0}"> 
    <apex:param value="{!summary.chgPlusNPilotlm}" /> 
    <apex:param value="{!summary.chgMinusNPilotlm}" /> </apex:outputText></apex:outputLink> 


    <apex:outputText style="font-weight:800" value="{0,date,MMMM YYYY} (actual)"><apex:param value="{!TODAY()-31}" /> </apex:outputText> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="{0, number, currency}"><apex:param value="{!summary.MRRlm}" /></apex:outputText> </apex:outputLink> 
    <apex:outputText value="{0, number, currency}"><apex:param value="{!null}" /></apex:outputText> 

    <apex:outputText style="font-style:italic" value="change"></apex:outputText> 
    <apex:outputText value="{0, number, currency}"><apex:param value="{!summary.MRRtm-summary.MRRlm}" /></apex:outputText> 
    <apex:outputText value="{0, number, currency}"><apex:param value="{!null}" /></apex:outputText> 

    <apex:outputText style="font-weight:800" value="{0,date,MMMM YYYY} (projected)"><apex:param value="{!TODAY()}" /> </apex:outputText> 
    <apex:outputLink target="_parent" value=""><apex:outputText value="{0, number, currency}"><apex:param value="{!summary.MRRtm}" /></apex:outputText> </apex:outputLink> 
    <apex:outputText value="{0, number, currency}"><apex:param value="{!null}" /></apex:outputText> 



    </apex:repeat> 
    </apex:pageBlockSection> 
</apex:pageBlock> 

Ich habe Unit-Tests getan für andere APEX-Controller, aber ich weiß nicht wissen, wie man einen Controller testet, der nur eine Aggregatfunktion ist. Hilfe wäre willkommen!

Antwort

0

ich viel tat googeln und Seele suchen, dies herauszufinden.

Die Lösung, nach der ich gesucht habe, war zweckdienlich: Ich schreibe keine Daten in dieser Klasse. Ich brauche keine Datenfabrik und verrückten Apparat, um das zu testen. Es war wirklich schwierig, die Beispiele dort zu verwenden und sie auf eine einfache Klasse anzuwenden, die nur die Datenbank abfragt und dann Werte ausgibt.

Als solche der Test, den ich geschrieben habe, war einfach und funktioniert für meine Zwecke (zum Code-Coverage-Grenzwerte nicht übersteigt):

@isTest 
 
public class badtest { 
 
    static testMethod void runTest() { 
 
     retrieveMRR a = new retrieveMRR(); 
 
      
 
    } 
 
    }

ich einfach eine Klasse erstellt und instanziiert dann die Klasse I versuchte zu testen. BAM 100% Codeabdeckung.

Hoffen, das hilft denen APEX lernen, um Visualforce-Seiten für Dashboards zu erstellen.

0

Verwenden Sie eine Testklasse als Datenfactory (siehe Anfangspunkt HERE), um ein Konto und eine Opportunity für dieses Konto zu erstellen (z. B. createTestAccount und createTestOpportunity).

Dann eine Instanz der Controller-Klasse in einer Testklasse erstellen und tut einige Behauptungen (HERE für ein gutes Beispiel)

Verwandte Themen