You need to sign in to do that
Don't have an account?
bohemianguy100
unit test help - list is empty
I have a VF page that displays a series of records with a checkbox next to each record. I have a command button that allows the user to update selected records.
The problem is my uptest method is returns an empty list when I try to call my update method that processes the selected records.
Here is my VF page:
<apex:page title="Unbilled Project Time" StandardController="Project_Invoice__c" extensions="ProjectTimeController"> <script> function checkAll(cb){ var inputElem = document.getElementsByTagName("input"); for(var i=0; i<inputElem.length; i++){ if(inputElem[i].id.indexOf("selectLine")!=-1){ inputElem[i].checked = cb.checked; } } } </script> <apex:sectionHeader title="Project Name: {!ProjectName} - Invoice Number: {!InvoiceNumber}" /> <apex:form > <apex:pageBlock id="pgBlock" > <apex:pageMessages /> <apex:PageBlockButtons location="both" > <apex:commandButton value="Update Project Time" action="{!processProjectTimeUpdates}" reRender="pgBlock" /> </apex:PageBlockButtons> <apex:pageBlockTable value="{!ProjectTime}" var="p" id="theTable" rowClasses="odd,even"> <apex:column > <apex:facet name="header"> <apex:inputCheckbox onclick="checkAll(this)" /> </apex:facet> <apex:inputCheckbox value="{!p.selected}" Id="selectLine" /> </apex:column> <apex:column > <apex:facet name="header"> Project Time # </apex:facet> <apex:outputLink value="/{!p.projTime.Id}">{!p.projTime.Name}</apex:outputLink> </apex:column> <apex:column > <apex:facet name="header"> Project </apex:facet> <apex:outputLink value="/{!p.projTime.Project__c}">{!p.projTime.Project__r.Name}</apex:outputLink> </apex:column> <apex:column > <apex:facet name="header"> Work Date </apex:facet> <apex:outputText value="{0,date,MM/dd/yyyy}"> <apex:param value="{!p.projTime.Work_Date__c}" /> </apex:outputText> </apex:column> <apex:column > <apex:facet name="header"> Hours </apex:facet> <apex:outputText value="{!p.projTime.Hours__c}" /> </apex:column> <apex:column > <apex:facet name="header"> Hourly Rate </apex:facet> <apex:outputText value="{!p.projTime.Hourly_Rate__c}" /> </apex:column> <apex:column > <apex:facet name="header"> Fee Amount </apex:facet> <apex:outputText value="{!p.projTime.Fee_Amount__c}" /> </apex:column> </apex:pageBlockTable> </apex:pageBlock> </apex:form> </apex:page>
Here is my controller:
public class ProjectTimeController { private List<Project_Invoice__c> listPI = new List<Project_Invoice__c>(); public String getProjectName() {return listPI[0].Project__r.Name;} public String getInvoiceNumber() {return listPI[0].Invoice_Number__c;} private List<ProjectTimeLines> ProjectTimeList {get; set;} public ProjectTimeController(ApexPages.StandardController stdController) { listPI = [Select Project__r.Name, Invoice_Number__c From Project_Invoice__c Where Id = :ApexPages.currentPage().getParameters().get('Id')]; } public List<ProjectTimeLines> getProjectTime() { ProjectTimeList = new List<ProjectTimeLines>(); List<Project_Time__c> lstPT = [Select Id, Name, Hours__c, Hourly_Rate__c, Fee_Amount__c, Work_Date__c, Project__c, Project_Invoice__c, Project__r.Name, Project__r.Id From Project_Time__c Where Fee_Amount__c > 0 AND Project_Invoice__c = null Order By Project__r.Name, Work_Date__c ASC]; for (Project_Time__c pt : lstPT) { ProjectTimeList.add(new ProjectTimeLines(pt)); } return ProjectTimeList; } public PageReference processProjectTimeUpdates() { List<Project_Time__c> selectedPTLs = new List<Project_Time__c>(); List<Project_Time__c> ptls = new List<Project_Time__c>(); for(ProjectTimeLines pt : ProjectTimeList){ if(pt.selected){ selectedPTLs.add(pt.projTime); } } Project_Invoice__c pi = [Select Id From Project_Invoice__c Where Project__c =: selectedPTLs[0].Project__c]; string str = ''; if (selectedPTLs.size() != 0) { for(Project_Time__c p : selectedPTLs){ str += p.Name + ', '; p.Project_Invoice__c = pi.Id; ptls.add(p); } update ptls; ApexPages.Message msg = new ApexPages.message(ApexPages.Severity.CONFIRM, 'The following Project Time records: ' + str + ' have been successfully updated.'); ApexPages.addMessage(msg); return null; } else { ApexPages.Message msg = new ApexPages.message(ApexPages.Severity.ERROR, 'No records selected. Please select at least one record.'); ApexPages.addMessage(msg); return null; } } public class ProjectTimeLines { public Project_Time__c projTime {get; set;} public Boolean selected {get; set;} public ProjectTimeLines(Project_Time__c pt) { projTime = pt;; } } static testMethod void test() { Project__c p = new Project__c(Name = 'Test Project', Hourly_Rate__c = 80.00); insert p; Project_Invoice__c pi = new Project_Invoice__c(Project__c = p.Id); insert pi; Project_Time__c pt = new Project_Time__c(Project__c = p.Id, Work_Date__c = System.today()); insert pt; PageReference page= new PageReference('/apex/ProjectTimeUnbilled?Id='+ pi.Id); Test.setCurrentPage(page); ApexPages.StandardController ctl = new ApexPages.StandardController(pi); ProjectTimeController Ctrl = new ProjectTimeController(ctl); Ctrl.getProjectTime(); Ctrl.getProjectName(); Ctrl.getInvoiceNumber(); //Ctrl.processProjectTimeUpdates(); } }
This is the line that that returns the empty list:
Project_Invoice__c pi = [Select Id From Project_Invoice__c Where Project__c =: selectedPTLs[0].Project__c];
Thanks for any help
Once you've constructed your controller, none of your project time lines have the selected flag set to true. You'll need to programmatically mimic the user checking the boxes.
Something like the following should set at least one:
You may also wish to change something in the wrapped Project_Time__c and verify after the update that the changes were written to the database.
All Answers
Once you've constructed your controller, none of your project time lines have the selected flag set to true. You'll need to programmatically mimic the user checking the boxes.
Something like the following should set at least one:
You may also wish to change something in the wrapped Project_Time__c and verify after the update that the changes were written to the database.
Hi,
If this was ever completed, could I please see solution for it. I've done similar thing and now have to test it.
Thank you very much.