You need to sign in to do that
Don't have an account?
pdosta
Assistance with Controller Test
Can anyone give a suggestion on the below test. When running the test, it does not return any rows and does not give me adequate coverage.
Controller
public class psuIdRequestController { private String requestid; public Participant_ID_Request__c participantmgr; public String strStatus; public User user; public Contact contactBusiness; public Contact contactTechnical; public Contact contactFinance; public Contact contactTreasury; public String comment; public String approver; public Date approvalDate; public psuIdRequestController(ApexPages.StandardController stdController) { requestid = ApexPages.currentPage().getparameters().get('requestid'); //Fetch participant for Participant ID Request record. participantmgr = [select Id, Name, DCF_Approval_Due_Date__c, Business_DCF_Approver__c, Technical_DCF_Approver__c, Finance_DCF_Approver__c, Treasury_DCF_Approver__c, Business_DCF_Approval__c, Technical_DCF_Approval__c, Finance_DCF_Approval__c, Treasury_DCF_Approval__c, Business_DCF_Approval_Date__c, Technical_DCF_Approval_Date__c, Finance_DCF_Approval_Date__c, Treasury_DCF_Approval_Date__c, Business_DCF_Comments__c, Technical_DCF_Comments__c, Finance_DCF_Comments__c, Treasury_DCF_Comments__c from Participant_ID_Request__c where Id =:requestid limit 1]; try{ contactBusiness = [select Id, Name from Contact where Id =: participantmgr.Business_DCF_Approver__c limit 1]; contactTechnical = [select Id, Name from Contact where Id =: participantmgr.Technical_DCF_Approver__c limit 1]; contactFinance = [select Id, Name from Contact where Id =: participantmgr.Finance_DCF_Approver__c limit 1]; contactTreasury = [select Id, Name from Contact where Id =: participantmgr.Treasury_DCF_Approver__c limit 1]; } catch(QueryException e){ // System.assert(false,'You must be assigned as an approver for this participant.'); } } public Participant_ID_Request__c getparticipant(){ return participantmgr; } public void Approve(){ setStatus('Approved'); } public void Reject(){ setStatus('Rejected'); } public String getUserName(){ return UserInfo.getName(); } public String getStatus(){ if(UserInfo.getName() == contactBusiness.Name ){ return participantmgr.Business_DCF_Approval__c; } else if (UserInfo.getName() == contactTechnical.Name ){ return participantmgr.Technical_DCF_Approval__c; } else if (UserInfo.getName() == contactFinance.Name ){ return participantmgr.Finance_DCF_Approval__c; } else if (participantmgr.Treasury_DCF_Approver__c <> Null ){ if (UserInfo.getName() == contactTreasury.Name ){ return participantmgr.Treasury_DCF_Approval__c; } } return strStatus; } public void setStatus(String status){ if(UserInfo.getName() == contactBusiness.Name ){ participantmgr.Business_DCF_Approval__c = status; participantmgr.Business_DCF_Comments__c = comment; participantmgr.Business_DCF_Approval_Date__c = approvalDate; update participantmgr; } else if (UserInfo.getName() == contactTechnical.Name ){ participantmgr.Technical_DCF_Approval__c = status; participantmgr.Technical_DCF_Comments__c = comment; participantmgr.Technical_DCF_Approval_Date__c = approvalDate; update participantmgr; } else if (UserInfo.getName() == contactFinance.Name ){ participantmgr.Finance_DCF_Approval__c = status; participantmgr.Finance_DCF_Comments__c = comment; participantmgr.Finance_DCF_Approval_Date__c = approvalDate; update participantmgr; } else if (participantmgr.Treasury_DCF_Approver__c <> Null ){ if (UserInfo.getName() == contactTreasury.Name ){ participantmgr.Treasury_DCF_Approval__c = status; participantmgr.Treasury_DCF_Comments__c = comment; participantmgr.Treasury_DCF_Approval_Date__c = approvalDate; update participantmgr; } } } public String getParticipantName() { return participantmgr.Name; } public String getComment(){ if(UserInfo.getName() == contactBusiness.Name ){ return participantmgr.Business_DCF_Comments__c ; } else if (UserInfo.getName() == contactTechnical.Name ){ return participantmgr.Technical_DCF_Comments__c; } else if (UserInfo.getName() == contactFinance.Name ){ return participantmgr.Finance_DCF_Comments__c; } else if (participantmgr.Treasury_DCF_Approver__c <> Null ){ if (UserInfo.getName() == contactTreasury.Name ){ return participantmgr.Treasury_DCF_Comments__c; } else{ comment = ''; return comment; } } else{ comment = ''; return comment; } } public void setComment(String value){ comment = value; } public Date getapprovalDate(){ if(UserInfo.getName() == contactBusiness.Name ){ return participantmgr.Business_DCF_Approval_Date__c; } else if (UserInfo.getName() == contactTechnical.Name ){ return participantmgr.Technical_DCF_Approval_Date__c; } else if (UserInfo.getName() == contactFinance.Name ){ return participantmgr.Finance_DCF_Approval_Date__c; } else if (participantmgr.Treasury_DCF_Approver__c <> Null ){ if (UserInfo.getName() == contactTreasury.Name ){ return participantmgr.Treasury_DCF_Approval_Date__c; } else{ approvalDate = null; return approvalDate; } } else{ approvalDate = null; return approvalDate; } } public String getApprover(){ if(UserInfo.getName() == contactBusiness.Name ){ return contactBusiness.Name; } else if (UserInfo.getName() == contactTechnical.Name ){ return contactTechnical.Name; } else if (UserInfo.getName() == contactFinance.Name ){ return contactFinance.Name; } else if (participantmgr.Treasury_DCF_Approver__c <> Null ){ if (UserInfo.getName() == contactTreasury.Name ){ return contactTreasury.Name; } else{ approver = 'Not Eligilble to approve'; return approver; } } else{ approver = 'Not Eligilble to approve'; return approver; } } }
Test
static testmethod void testPsuIdRequest() { User BusinessUser = [select id,name,ContactId from User where Profile.Name = 'PORTAL: GNS Technical Account Management' and IsActive = true limit 1]; User TechnicalUser = [select id,name,ContactId from User where Profile.Name = 'PORTAL: GNS Partner Operations' and IsActive = true limit 1]; User FinanceUser = [select id,name,ContactId from User where Profile.Name = 'PORTAL: GNS Finance' and IsActive = true limit 1]; User InvalidUser = [select id,name,ContactId from User where Profile.Name = 'PORTAL: AMEX Treasury' and IsActive = true limit 1]; System.RunAs(BusinessUser){ RecordType recreq = [select ID,Name from RecordType where Name = 'ID REQUEST: Draft Approved' and SObjectType = 'Participant_ID_Request__c']; Participant_ID_Request__c preq = new Participant_ID_Request__c(recordtypeid=recreq.Id, Name='Test Deal1'); insert preq; ApexPages.PageReference testpage = Page.psudcfreview; ApexPages.StandardController con = new ApexPages.StandardController(preq); psuIdRequestController pnid = new psuIdRequestController(con); Test.setCurrentPage(testpage); ApexPages.currentPage().getParameters().get('requestid'); pnid = new psuIdRequestController(con); pnid.comment = 'testing'; pnid.approve(); } }
It is more adequate to create the objects instance Account,Partner,Finance and treasury...you can avoid create a user.
and to get more coverage..you can explicitly call your method individually after the initialisation of the class :
Maybe you will have to see whcih to call first.It is not necessary to catch the values return.
another things that i didn't see u calling or using : the big method setStatus. Where do you call it in your methods????
* call the method by .getComment and not by .Comment as in VF page...ok
Please don't avoid setting up users etc...
If you do your test method will get coverage but for future modification to the org you cannot then count on your test method to properly recognize any issues that could arise.
Test methods are very important to prove the validity of your code aswell as making updates and modifications easier to manage.
I have created some sample code below that should help, be aware it may need a little modification to work with your page/class.
Since you are passing in a standard controller I assume that your page is using this class as an extension,
in which case your test method should look something like this:
Please not the use of asserts, these are very important within testmethods and will also help you resolve any issues you encounter whilst writing your test method.
Hope this helps,
Melvin!
Thanks Melvin, this is much cleaner, but I still run into trhe same issue where the test fails because it cannot find the record for the requestid. I get the following error: "System.QueryException: List has no rows for assignment to SObject" and it points to not being able to pull a row for this part of the code:
I cannot figure out why it cannot find the record I created. Any thoughts?
sorry, this was not an issue with the test method but with the class itself so I ignored it.
As far as im aware a select query will return a list even with limit 1 applied (limit 1 simply sets the maximum size of the list returned to 1)
try something like this:
Hope this helps,
Melvin!
Will it matter if I change the query. I am currently passing the "requestid" variable from a Custom Button. wil that make a difference in how I build the test?
No, if you look at the sample test method I provided, you will see that I have passed the requestid into the page param before assigning the page for use in the test. This mimics the way you would access the page through a button click passing the id param. If you were to change the query this would still work, however if the use of the id param becomes redundent you will simply need to remove the add param line of code form the test method.
Hope this answers your question,
Melvin!