+ Start a Discussion
SFDC GuestSFDC Guest 

Test class for Attachment

Hi All,

Can you plz help me on covering the below two lines of attachment for below class. Current code coverage is 86%. Need to get 100%. Thanks
 
User-added image


Test class:

@isTest
public class CaseCreationWithQAttachment_Test {
    static testMethod void test1()
    {
        Case cs = new Case(Subject = 'Test', Origin = 'Phone', Status = 'New');
        insert cs;
        
        Attachment attach=new Attachment();       
        attach.Name='Unit Test Attachment';
        Blob bodyBlob=Blob.valueOf('Unit Test Attachment Body');
        attach.body=bodyBlob;
        attach.parentId=cs.id;
        insert attach;
        
        List<Attachment> attachments=[select id, name from Attachment where parent.id=:cs.id];
        System.assertEquals(1, attachments.size());
        
        ApexPages.StandardController stdCtr = new ApexPages.StandardController(cs);
        CaseCreationWithQAttachment ctr = new CaseCreationWithQAttachment(stdCtr);
        ctr.caseData = cs;
        ctr.attachData = attach;
        ctr.customSave();   
    }
}
Best Answer chosen by SFDC Guest
Amit Singh 1Amit Singh 1
Use Below code for Controller and Test Class

Controller 
public with sharing class CaseCreationWithQAttachment{
    public case caseData {get; set;}
    public Attachment attachData {get; set; }
    public CaseCreationWithQAttachment(ApexPages.StandardController controller){
        caseData = (Case)controller.getRecord();
        attachData = new Attachment();
    }
    
    public PageReference CustomSave(){
        try{
            insert caseData;
            attachData.ParentId = caseData.id;
            insert attachdata;
            If(Test.isRunningTest()) Integer i = 10/0;
        }catch(EXCEPTION e){
            ApexPages.addMessages(e);
        }
        PageReference pageRef = new PageReference('/'+caseData.Id);
        pageRef.setRedirect(true);
        return pageRef;
    }

}

Test Class
@isTest
public class CaseCreationWithQAttachment_Test {
    static testMethod void test1()
    {
        Case cs = new Case(Subject = 'Test', Origin = 'Phone', Status = 'New');
        //insert cs;
        
        Attachment attach=new Attachment();       
        attach.Name='Unit Test Attachment';
        Blob bodyBlob=Blob.valueOf('Unit Test Attachment Body');
        attach.body=bodyBlob;
        attach.parentId=cs.id;
        //insert attach;
        
        List<Attachment> attachments=[select id, name from Attachment where parent.id=:cs.id];
        System.assertEquals(0, attachments.size());
        
        ApexPages.StandardController stdCtr = new ApexPages.StandardController(cs);
        CaseCreationWithQAttachment ctr = new CaseCreationWithQAttachment(stdCtr);
        ctr.caseData = cs;
        ctr.attachData = attach;
        ctr.customSave(); 
    }
}

All Answers

Sandeep WaliaSandeep Walia
Hi Sohel,

Your main class does not have all the required fields that are required for inserting Attachment object.
As per this documentation (https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_attachment.htm) you require three Fields:
  • Body
  • Name
  • ParentId
User-added image
I was able to increase your code coverage to 94% by using two different try catch blocks.
And this is the debug log that I am getting for line 20. This exception is most probably coming because you have not entered the other required fields for an attachment
User-added image

PS : I have used your test class as it is and there is nothing wrong with it.

I suggest you enter the other required fields in the in your apex class.

Hope this helps,
Sandeep
SFDC GuestSFDC Guest
Thanks Amit & Sandeep,
 
I tried, but it’s not covered. Can u please update class & test class  with required fields wherever required.
 
Thanks
 
SFDC GuestSFDC Guest
Here is the class:

public with sharing class CaseCreationWithQAttachment{
    public Case caseData {get; set;}
    public Attachment attachData {get; set;}
    public CaseCreationWithQAttachment(ApexPages.StandardController stdCtr){
    caseData = (Case) stdCtr.getRecord();
    attachData = new Attachment();
    }
    
    public PageReference customSave(){
    try{
        insert caseData;
        
        attachData.ParentId = caseData.Id;
        insert attachData;
        }
        catch(Exception e){
        ApexPages.addMessages(e);
        }
    PageReference p = new PageReference('/'+caseData.Id);
    p.setRedirect(true);
    return p;
    }

}
SFDC GuestSFDC Guest
Test class for above class:
@isTest
public class CaseCreationWithQAttachment_Test {
    static testMethod void test1()
    {
        Case cs = new Case(Subject = 'Test', Origin = 'Phone', Status = 'New');
        insert cs;
        
        Attachment attach=new Attachment();       
        attach.Name='Unit Test Attachment';
        Blob bodyBlob=Blob.valueOf('Unit Test Attachment Body');
        attach.body=bodyBlob;
        attach.parentId=cs.id;
        insert attach;
        
        List<Attachment> attachments=[select id, name from Attachment where parent.id=:cs.id];
        System.assertEquals(1, attachments.size());
        
        ApexPages.StandardController stdCtr = new ApexPages.StandardController(cs);
        CaseCreationWithQAttachment ctr = new CaseCreationWithQAttachment(stdCtr);
        ctr.caseData = cs;
        ctr.attachData = attach;
        ctr.customSave();
        
    }

}

Below code is not covered in apex class: 86%

 attachData.ParentId = caseData.Id;
  insert attachData;
Amit Singh 1Amit Singh 1
Use Below code for Controller and Test Class

Controller 
public with sharing class CaseCreationWithQAttachment{
    public case caseData {get; set;}
    public Attachment attachData {get; set; }
    public CaseCreationWithQAttachment(ApexPages.StandardController controller){
        caseData = (Case)controller.getRecord();
        attachData = new Attachment();
    }
    
    public PageReference CustomSave(){
        try{
            insert caseData;
            attachData.ParentId = caseData.id;
            insert attachdata;
            If(Test.isRunningTest()) Integer i = 10/0;
        }catch(EXCEPTION e){
            ApexPages.addMessages(e);
        }
        PageReference pageRef = new PageReference('/'+caseData.Id);
        pageRef.setRedirect(true);
        return pageRef;
    }

}

Test Class
@isTest
public class CaseCreationWithQAttachment_Test {
    static testMethod void test1()
    {
        Case cs = new Case(Subject = 'Test', Origin = 'Phone', Status = 'New');
        //insert cs;
        
        Attachment attach=new Attachment();       
        attach.Name='Unit Test Attachment';
        Blob bodyBlob=Blob.valueOf('Unit Test Attachment Body');
        attach.body=bodyBlob;
        attach.parentId=cs.id;
        //insert attach;
        
        List<Attachment> attachments=[select id, name from Attachment where parent.id=:cs.id];
        System.assertEquals(0, attachments.size());
        
        ApexPages.StandardController stdCtr = new ApexPages.StandardController(cs);
        CaseCreationWithQAttachment ctr = new CaseCreationWithQAttachment(stdCtr);
        ctr.caseData = cs;
        ctr.attachData = attach;
        ctr.customSave(); 
    }
}
This was selected as the best answer
SFDC GuestSFDC Guest
Thanks Amit & sandeep.
What is use of If(Test.isRunningTest()) Integer i = 10/0; in class ? and 
we are not inserting case & attachment in test class. these will be inserted while calling ctr.customSave() method in test class. right ?
 
Sandeep WaliaSandeep Walia
Hi Sohel, 

This code is having 100% test coverage
Apex Class
public class CaseCreationWithQAttachment {
    public Case CaseData {get; set;}
    public attachment attachData {get; set;}
    public String fileName {get; set;}
    public Blob resume {get; set;}
    public CaseCreationWithQAttachment(ApexPages.StandardController stdCtr){
        caseData = (Case) stdCtr.getRecord();
        attachData = new Attachment();
        attachData.Name = fileName;
        attachData.Body = resume;
    }
    public PageReference customSave(){
        try{
            insert CaseData;
        }
        catch(exception e){
            ApexPages.addMessages(e);
        }
        try{
            insert attachData;
        }
        catch(exception e){
            ApexPages.addMessages(e);
        }
        PageReference P = new PageReference('/' + caseData.Id);
        p.setRedirect(true);
        return P;
    }
}

Test Class
@isTest
public class CaseCreationWithQAttachment_Test {
    static testMethod void test1()
    {
        Case cs = new Case(Subject = 'Test', Origin = 'Phone', Status = 'New');
        insert cs;
        
        Attachment attach=new Attachment();       
        attach.Name='Unit Test Attachment';
        Blob bodyBlob=Blob.valueOf('Unit Test Attachment Body');
        attach.body=bodyBlob;
        attach.parentId=cs.id;
        insert attach;
        
        List<Attachment> attachments=[select id, name from Attachment where parent.id=:cs.id];
        System.assertEquals(1, attachments.size());
        
        ApexPages.StandardController stdCtr = new ApexPages.StandardController(cs);
        CaseCreationWithQAttachment ctr = new CaseCreationWithQAttachment(stdCtr);
        ctr.caseData = cs;
        ctr.attachData = attach;
        ctr.customSave();   
    }
}

Code Coverage
User-added image

The Parent Id of case is getting associated automatically since you are using standard controller.​
Please refer this blog to know how t o insert attachment from VF Page:

 
http://salesforceworld.blogspot.com/2011/06/save-attachment-in-apex.html


Hope this helps,
Sandeep
Amit Singh 1Amit Singh 1
Yes, You are right and use of Test.isRunningTest in test class is for covering the exception and that line will only execute when test is running

Please mark as best answer if this helps 
SFDC GuestSFDC Guest
Thanks Sandeep & Amit. Greatly Appreciated. Both solutions are useful.
 
Thomas Kayser-EichbergThomas Kayser-Eichberg
Hi Amit,

is there a chance you can help me out I am trying to attach and PDF from an VF Page to my quote record.
It quite works fine in the sandbox, but cant get it covered more than 36% by test class.

here is my class:
public class quotePDFExtension {
    ApexPages.StandardController controller;
    public Quote quote {get;set;}
    public PageReference rtn;
    public quotePDFExtension(ApexPages.StandardController c){
        quote = (Quote)c.getRecord();
        rtn = c.view();
    }
    public PageReference attachQuotePDF() {
        /* Get the page definition */
        PageReference pdfPage = Page.angebot;
        pdfPage.getParameters().put('id',quote.id);
        /* generate the pdf blob */
        Blob pdfBlob = pdfPage.getContent();
        /* create the attachment against the offer */
        Attachment a = new Attachment(parentId = quote.id, name=quote.Angebot_Nr__c + '.pdf', body = pdfBlob);
        /* insert the attachment */
        insert a;
        /* send the user back to the offer detail page */
        return rtn;
    }
}

and here is the test I wrote by now:
 
@isTest 
public class attachQuoteTestClass 
{
 static testMethod void testMethod1() 
 {
 Account testAccount = new Account();
 testAccount.Name = 'Test Account';
 insert testAccount;
 
 Fahrzeughersteller__c testHersteller = New Fahrzeughersteller__c();
 testHersteller.Name = 'BMW Test';
 insert testHersteller;
 
 Opportunity testOpportunity = new Opportunity();
 testOpportunity.Name = 'STA-KE 101';
 testOpportunity.Fahrzeughersteller__c = testHersteller.id;
 testOpportunity.Fahrzeug_Modell__c = 'TEST BMW 530d Touring';
 testOpportunity.Baujahr__c = '2010';
 testOpportunity.AccountId = testAccount.id;
 testOpportunity.CloseDate = Date.newInstance(2019, 10, 31);
 testOpportunity.StageName = 'Qualification';
 insert testOpportunity;
 
 Quote testQuote = new Quote();
 testQuote.OpportunityId = testOpportunity.id;
 testQuote.Gutachtennummer__c = '999195041551';
 testQuote.Gutachten_Datum__c = Date.newInstance(2019, 10, 01);
 testQuote.Angebotsdatum__c = Date.today();
 testQuote.Name='Test Quote record';
 insert testQuote;

 Test.StartTest(); 
  ApexPages.StandardController controller = new ApexPages.StandardController(testQuote);
  quotePDFExtension testQuotePlan = new quotePDFExtension(controller);

  PageReference pdfPage = Page.angebot;
  pdfPage.getParameters().put('id', String.valueOf(testQuote.Id));
  Test.setCurrentPage(pdfPage);
  
  Blob b = blob.valueof('error');
  Try { b = pdfPage.getContent();}
  Catch(Exception e)
  {
  Attachment attachedPDF = new Attachment();
  attachedPDF.Name = testQuote.Angebot_Nr__c + '.pdf';
  attachedPDF.parentId = testQuote.id;
  attachedPDF.body = b;
  insert attachedPDF;
  }
  
 Test.StopTest();
 }
}

I realy hope to get it running in my production.
kind regards 
Thomas