You need to sign in to do that
Don't have an account?
albonill
Need help creatng a test for trigger
Hi,
I got assistance creating my trigger and now I find out that it needs to be tested in order to be uploaded to production. The trigger is designed to auto-populate the Opportunity_Contact__c field, with the Contact that has been designated as the Renewal Owner, when a record is originally created only. Any assistance would be greatly appreciated.
trigger setRenewalOwnerContact on Opportunity (before insert) { List<Opportunity > optylist = Trigger.new; for ( Opportunity opty : optylist ) { if (opty.Opportunity_Contact__c == null) { for (List<Contact> contactlist : [SELECT id FROM Contact WHERE Accountid = :opty.Accountid AND Contact_Type__c = 'Renewal Owner' LIMIT 1]) { for(Contact con : contactlist ) { opty.Opportunity_Contact__c = con.id; } } } } }
Regards,
Alex
I updated the code above again and highlighted the changes in bold.
The problem could have been solved in two ways: 1) changing the trigger to an AFTER INSERT or; 2) modifying the code as I did. Changing to an After Insert would have been easier but I just left it as a Before Insert since that's the way you had it.
The issue was that the SOQL query referenced the Opportunity Id but since the records hadn't been inserted yet ( since it's a before insert trigger ) there was no Opportunity Id.
Anyway, try it again.
~ Clint
All Answers
Hi, Please change your code to :
For test, Create a test contact with type = 'Renewal Owner' and create a test opportunity. Insert the opportunity.
You might want to first re-write your trigger so that you don't have a SOQL query inside the for-loop. Otherwise, you'll probably hit a governor limit if you every insert a bulk of Opportunities.
Try it this way.
trigger setRenewalOwnerContact on Opportunity ( before insert ) {
Map<Id,Id> acctToContactMap = new Map<Id,Id>();
Set<Id> acctIds = new Set<Id>();
for( Opportunity o : Trigger.New ) {
acctIds.add( o.AccountId );
}
for( Contact c : [ select AccountId, Id from Contact where AccountId IN :acctIds and Contact_Type__c = 'Renewal Owner' ] ) {
acctToContactMap.put( c.AccountId, c.Id );
}
for( Opportunity opty : Trigger.New ) {
if( opty.Opportunity_Contact__c == null && opty.AccountId != null ) {
opty.Opportunity_Contact__c = acctToContactMap.get( opty.AccountId );
}
}
}
To test it.
public class OpportunityTriggerTest {
static testmethod void testOne() {
Account a = new Account( Name = 'Test Account' );
insert a;
Contact c = new Contact( FirstName = 'Testy', LastName = 'Testerson', Contact_Type__c = 'Renewal Owner', AccountId = a.Id );
insert c;
Opportunity o = new Opportunity( Name = 'Test Opp', StageName = 'Prospecting', CloseDate = System.Today(), AccountId = a.Id );
insert o;
o = [ select Opportunity_Contact__c from Opportunity where Id = :o.Id ];
System.assertEquals( c.Id, o.Opportunity_Contact__c );
}
}
Thanks for the detailed answser. I changed my trigger to what you suggested and I received this message when trying to save it:
Any suggestions?
Put a colon in front of Trigger.New in the SOQL query. I updated the code that I posted earlier so you'll see the change.
Clint
Hello billyclint,
I don't know how long it's going to take to me to know as much as you, but I'm sure it isn't going to be soon. I was able to save the Trigger just fine with the updated code.
I ran the test and these are the results:
Method Name: OpportunityTriggerTest.testOne
Message: System.AssertException: Assertion Failed: Expected: 003S000000VI8qNIAT, Actual: null
Stack Trace: Class.OpportunityTriggerTest.testOne: line 28, column 1
I really appreciate your help.
Hi,
Please change :
Opportunity o = new Opportunity( Name = 'Test Opp', StageName = 'Prospecting', CloseDate = System.Today(), AccountId = a.Id );
With :
Opportunity o = new Opportunity( Name = 'Test Opp', Opportunity_Contact__c=c.id, StageName = 'Prospecting', CloseDate = System.Today(), AccountId = a.Id );
I updated the code above again and highlighted the changes in bold.
The problem could have been solved in two ways: 1) changing the trigger to an AFTER INSERT or; 2) modifying the code as I did. Changing to an After Insert would have been easier but I just left it as a Before Insert since that's the way you had it.
The issue was that the SOQL query referenced the Opportunity Id but since the records hadn't been inserted yet ( since it's a before insert trigger ) there was no Opportunity Id.
Anyway, try it again.
~ Clint
Clint,
Thanks for your assistance. I was able to get 100% coverage using your code - two thumbs up! I really appreciate your expertise and I hope that I acquire the Apex knowledge you have someday.
Regards,
Alex