function readOnly(count){ }
Starting November 20, the site will be set to read-only. On December 4, 2023,
forum discussions will move to the Trailblazer Community.
+ Start a Discussion
bohemianguy100bohemianguy100 

unit test code - missing line coverage on save method

I'm working on some unit test coverage code and currently have 77% of the controller covered.  I'm trying to get the remaining lines covered before adding my assert statements.

 

The lines missing code coverage are in my save() method (see the screenshot below).

 

In my test method, I've initialized the controller and passed in a new instance of the StandardSetController with a list of the sObject being used.  I have called all the properties and methods in the controller.

 

Can anyone provide some help on how I can get the missing lines in my save method covered?  I need to create a new task to use in the save method that is being attached to multiple records.

 

Here is my controller code:

 

public class MassAddActivityController { private List<Service_Delivery__c> sds; private Task assignedTo = new Task(); private Task status = new Task(); private Task activityDate = new Task(); private Task clientAttendees = new Task(); private Task hsgAttendees = new Task(); private Task presenter = new Task(); private Task purpose = new Task(); private Task dynamics = new Task(); private Task outcomes = new Task(); private Task description = new Task(); private Task sendContactReport = new Task(); private Boolean render; private Integer count; public Task task {get; set;} public Task getAssignedTo() { return assignedTo; } public Task getStatus() { return status; } public String subject { get; set; } public Task getActivityDate() { return activityDate; } public Task getClientAttendees() { return clientAttendees; } public Task getHsgAttendees() { return hsgAttendees; } public Task getPresenter() { return presenter; } public Task getPurpose() { return purpose; } public Task getDynamics() { return dynamics; } public Task getOutcomes() { return outcomes; } public Task getDescription() { return description; } public Task getSendContactReport() { return sendContactReport; } public MassAddActivityController(ApexPages.StandardSetController stdSetController) { init((List<Service_Delivery__c>) stdSetController.getSelected()); status.status = 'Completed'; subject = 'Presentation/Meeting'; assignedTo.OwnerId = UserInfo.getUserId(); DateTime dt = System.now(); Date currentDate = date.newinstance(dt.year(), dt.month(), dt.day()); activityDate.activityDate = currentDate; render = false; } public void init(List<Service_Delivery__c> sds) { List<Id> ids = new List<Id>(); for (Service_Delivery__c sd : sds) { ids.add(sd.id); } this.sds = [Select Id, Name From Service_Delivery__c Where Id in :ids]; count = [Select Count() From Service_Delivery__c Where Id in :ids]; } public Id getRecordTypeId() { RecordType rt = [Select Id From RecordType WHERE Name = 'Contact Reports Entry']; Id recordTypeId = rt.Id; return recordTypeId; } public List<Service_Delivery__c> getServiceDeliveries() { return sds; } public List<SelectOption> getItems() { Schema.DescribeFieldResult pklst = Schema.Task.Subject.getDescribe(); List<Schema.PicklistEntry> ple = pklst.getPicklistValues(); List<SelectOption> options = new List<SelectOption>(); for(Schema.PicklistEntry f : ple) { options.add(new SelectOption(f.getLabel(), f.getLabel())); } return options; } public PageReference save() { try { for (Service_Delivery__c sd : sds) { Task t = new Task(); t.recordTypeId = getRecordTypeId(); t.ownerId = assignedTo.OwnerId; t.status = 'Completed'; t.subject = subject; t.activityDate = activityDate.activityDate; t.whatId = sd.Id; t.Client_Company_Attendees__c = clientAttendees.Client_Company_Attendees__c; t.Health_Strategies_Group_Attendees__c = hsgAttendees.Health_Strategies_Group_Attendees__c; t.Meeting_Presenter__c = presenter.Meeting_Presenter__c; t.Purpose__c = purpose.Purpose__c; t.Dynamics__c = dynamics.Dynamics__c; t.Outcomes__c = outcomes.Outcomes__c; t.description = description.description; t.Send_Contact_Report__c = sendContactReport.Send_Contact_Report__c; t.Mass_Added_Date__c = Date.today(); insert t; } ApexPages.Message msg = new ApexPages.message(ApexPages.Severity.INFO, 'Activities added successfully.'); ApexPages.addMessage(msg); render = true; return null; } catch (Exception ex) { ApexPages.Message errMsg = new ApexPages.Message(ApexPages.Severity.ERROR, ex.getMessage()); ApexPages.addMessage(errMsg); return null; } } public boolean getRendered() { return render; } public Integer getCount() { return count; } static testMethod void test() { List<Service_Delivery__c> sds = [Select id, name From Service_Delivery__c LIMIT 5]; MassAddActivityController ctrl = new MassAddActivityController(new ApexPages.StandardSetController(sds)); ctrl.getAssignedTo(); ctrl.getStatus(); ctrl.getActivityDate(); ctrl.getClientAttendees(); ctrl.getHsgAttendees(); ctrl.getPresenter(); ctrl.getPurpose(); ctrl.getDynamics(); ctrl.getOutcomes(); ctrl.getDescription(); ctrl.getSendContactReport(); ctrl.getCount(); ctrl.getRendered(); ctrl.getRecordTypeId(); ctrl.getServiceDeliveries(); ctrl.getItems(); ctrl.save(); } }

 

screenshot

screenshot

Best Answer chosen by Admin (Salesforce Developers) 
rscottrscott
There is a setSelected method on the standardsetcontroller that takes a list of sObjects. Wish I had seen that before.

All Answers

visulaforcevisulaforce

I think list returned in bold line is empty because no record is slected from list of records:

 

public MassAddActivityController(ApexPages.StandardSetController stdSetController) { init((List<Service_Delivery__c>) stdSetController.getSelected()); status.status = 'Completed'; subject = 'Presentation/Meeting'; assignedTo.OwnerId = UserInfo.getUserId(); DateTime dt = System.now(); Date currentDate = date.newinstance(dt.year(), dt.month(), dt.day()); activityDate.activityDate = currentDate; render = false; }

 

S_LieS_Lie

One of the possibility is no data in the object (Service_Delivery__C )

I would suggest you to create new Service_Delivery__c


List<Service_Delivery__c> sds = new List<Service_Delivery__c>  

 Service_Delivery__c sd = new Service_Delivery__c('ServiceDelivery');

sds.add (sd);

 

it should work.

bohemianguy100bohemianguy100

I created a service delivery record and added to the list as you indicated.  when I ran the test, the lines are still not getting covered.

 

Here is the updated test method.  What am I missing?

 

static testMethod void test() { //get an account Account a = [Select Id From Account LIMIT 1]; //create an empty list List<Service_Delivery__c> sds = new List<Service_Delivery__c>(); //create one record Service_Delivery__c sd = new Service_Delivery__c(Name='Test1',Account__c=a.Id); //add the record to the list sds.add(sd); //pass the list into the controller MassAddActivityController ctrl = new MassAddActivityController(new ApexPages.StandardSetController(sds)); //call all the properties and methods ctrl.getAssignedTo(); ctrl.getStatus(); ctrl.getActivityDate(); ctrl.getClientAttendees(); ctrl.getHsgAttendees(); ctrl.getPresenter(); ctrl.getPurpose(); ctrl.getDynamics(); ctrl.getOutcomes(); ctrl.getDescription(); ctrl.getSendContactReport(); ctrl.getCount(); ctrl.getRendered(); ctrl.getRecordTypeId(); ctrl.getServiceDeliveries(); ctrl.getItems(); ctrl.save(); }

 

rscottrscott
So, you are creating a list of Service_Delivery__c objects and creating a standardsetcontroller based on it. However, in the constructor of the controller (MassAddActivityController) you are initializing the list (sds) based on what has been selected (stdSetController.getSelected()). Most likely that list is empty because nothing was ever set as being selected. Unfortunately, we are having the same issue and don't know how, in a test, to mark a record in a set controller as being selected. Anyone? Can you even do it?
bohemianguy100bohemianguy100

I see exactly what you mean now.  I have a list populated with 5 records, but nothing is selected.  Got it.

 

Now, to the question you posed.  How can you mark the records as selected?

rscottrscott
There is a setSelected method on the standardsetcontroller that takes a list of sObjects. Wish I had seen that before.
This was selected as the best answer
bohemianguy100bohemianguy100
Thank you...that solved the problem!
DoctorDoctor
How exactly did you solve this issue? I am having a very similar problem... it is driving me mad!
bohemianguy100bohemianguy100

Here is how I solved the issue:

 

List<Service_Delivery__c> sds = [Select id, name From Service_Delivery__c LIMIT 5]; ApexPages.StandardSetController setSds = new ApexPages.StandardSetController(sds); setSds.setSelected(sds); MassAddActivityController ctrl = new MassAddActivityController(setSds);

Hope this helps.