2017-07-18 1 views
0

Administrateur SFDC de longue date, plongeant pour la première fois dans APEX.Ecriture du test d'unité pour le contrôleur personnalisé Salesforce à l'aide de la fonction AggregateResults

J'ai construit un contrôleur personnalisé pour un composant Dashboard (page Visualforce). Le contrôleur fonctionne, mais nécessite des tests unitaires pour pousser à la production (ne demandez pas - org souffre d'une faible couverture).

Voici le contrôleur:

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

    } 
    } 
} 

Voici la page Visualforce si nécessaire

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

Je l'ai fait des tests unitaires pour d'autres contrôleurs APEX, mais je ne savoir comment tester un contrôleur qui est juste une fonction agrégée. L'aide serait appréciée!

Répondre

0

Je l'ai fait beaucoup de googler et de l'âme chercher à comprendre.

La solution que je cherchais était expédient: je n'écris pas de données dans cette classe. Je n'ai pas besoin d'une usine de données et d'un appareil fou pour tester cela. Il était vraiment difficile de prendre les exemples et de les appliquer à une classe simple qui interroge simplement la base de données et imprime ensuite les valeurs.

En tant que tel, le test que j'ai écrit est simple et fonctionne pour mes besoins (pour respecter les limites de couverture de code):

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

J'ai simplement créé une classe, puis instancié la classe I essayait de tester. BAM 100% de couverture de code.

Espérons que cela aide ceux qui apprennent APEX afin de créer des pages Visualforce pour les tableaux de bord.

0

Utilisez une classe de test en tant que fabrique de données (voir trailhead HERE) pour créer un compte et une opportunité pour ce compte (par exemple, une classe createTestAccount et createTestOpportunity).

Ensuite, créez une instance de la classe de contrôleur dans une classe de test et faire quelques affirmations (voir HERE pour un bon exemple)