0

new developer and I am struggling with getting 100% code coverage on a test class. I have written a class to count tasks with unique subline lines and then update a field on a custom object with the count. Basically, all code below the For(task t : taskList) loop is not running. The method is being called from a trigger handler and the test method is inserting relationship_owners and contacts from a data factory.

Here is the method

public static void uniqueRelationshipOwnerEmails(List<relationship_owner__c> roList){
    //count the unique emails  that have been sent by a relationship owner
    // add all contacts associated with relationship owner to map.         
    Map<id, Contact> contactMap = new Map<Id, Contact>([SELECT Id,
                                                        New_Relationship_Owner1__c
                                                        FROM Contact
                                                        WHERE New_Relationship_owner1__c IN : roList]);
    system.debug('Contacts found = ' + contactMap.size());
    //put tasks where whoId is in the contact map into a new map
    List<Task> taskList = [SELECT Id, WhoId,Subject
                           FROM Task 
                           WHERE WhoId IN :contactMap.keySet()
                           AND Subject LIKE '%Pardot List Email%'];
    system.debug('Tasks Found  and added to map = ' + taskList.size());
    //use set to dedupe the list
    Map<Id, Set<String>> subjectLineMap = new Map<Id, Set<String>>();

    for(task t : taskList){
        Id ownerId = contactMap.get(t.WhoId).New_Relationship_Owner1__c;            
        if(!subjectLineMap.containsKey(ownerId)){
            subjectLineMap.put(ownerId, new Set<String>());              

        }            
    }
    system.debug('Map size   =' + subjectLineMap.size());
    system.debug('map values =' + subjectLineMap.values());
    system.debug('map keys   =' + subjectLineMap.Keyset());
    for(relationship_owner__c r : roList){
        r.Unique_Emails_Sent__c = subjectLineMap.get(r.Id).size();
        roList.add(r);

    }
    insert(roList);         



}

and here is the test method.

@isTest
static void uniqueEmailTest(){
    TestDataFactory.createRelationshipOwnerandInfuencer(5, 1);
    List<relationship_owner__C> ownerTestList = [SELECT id, Unique_Emails_Sent__c From relationship_owner__c];
    //update ownerTestList;
    //get the contacts and assign them tasks
    List<Contact> influencers = [SELECT Id FROM Contact];        
    List<Task> tasks = new List<Task>();
    for(Contact c : influencers){
       Task t = new Task(Subject = 'Pardot List Email 1', WhoId = c.Id);
        tasks.add(t);
    }
    insert tasks;        
    system.debug('task size' + tasks.size());
    update ownerTestList;
}

Thank you for your help.

2
  • You don't really need 100% coverage, honestly I have rarely seen classes covered 100% when building a large scale application. I do try to get more than 90% to accommodate any low coverage classes but most of the times anything around 80 - 85 should be considered good. If you have coverage sufficiently above 75%, then you should be fine. What is your current coverage as of now? Btw - I don't see your test class calling the method which you are trying to cover.
    – Jayant Das
    Commented Oct 17, 2018 at 21:30
  • one way to help think about testmethods is the Given-When-Then model which forces you to think through in comments what you are trying to test and then you can code the testmethod accordingly.
    – cropredy
    Commented Oct 18, 2018 at 1:35

1 Answer 1

1

You will need to insert Contact records (and relationship_owner__C records) in your test before this line for this query to return any results and so create the Task records needed to cause the code under test to run:

List<Contact> influencers = [SELECT Id FROM Contact];

By design, unit tests don't see most types of records that are in the org: you have to explicitly add records in your test.

(I presume uniqueRelationshipOwnerEmails is called from a trigger?)

The point of tests is to confirm the behavior of the code under test: coverage is just an indicator, not a sufficient condition. So do add additional logic to your test (typically queries and asserts) that confirm the expected effects of the code under test.

1
  • I am sorry I was not clear in my original post. The method I called from the testDataFactory created 5 relationship owners and 1 contact per owner. I will edit my original post. And the method is called from a trigger handler. Right now I have 66% code coverage. Commented Oct 17, 2018 at 22:48

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .