You need to sign in to do that
Don't have an account?
Mathew Andresen 5
Testing for an update that throws an error
Hi,
I have a tasting object that when saved automatically generates an event. If that tasting object is updated, it also updates the dates of the event. Of course if someone deletes the event, that would cause an error on update. I'm handling the error in the trigger function with an alert about the event.
But I'm not quite sure how to properly test that in my testing class. I saw in the trailhead example they did something like Database.xxx but I'm not sure how that applies with update, if it even does.
My complete code if it helps
and the testing class
Thanks,
I have a tasting object that when saved automatically generates an event. If that tasting object is updated, it also updates the dates of the event. Of course if someone deletes the event, that would cause an error on update. I'm handling the error in the trigger function with an alert about the event.
But I'm not quite sure how to properly test that in my testing class. I saw in the trailhead example they did something like Database.xxx but I'm not sure how that applies with update, if it even does.
My complete code if it helps
trigger TastingEvent on Tasting__c (after insert, after update) { List<Event> myEvent = new List<Event>(); User u = [Select id, FirstName from User where id =: UserInfo.getUserId() LIMIT 1]; //Integer size = Trigger.Size; if(Trigger.isAfter && Trigger.isInsert && Trigger.size <2) { for(Tasting__c taste:Trigger.New) { Event e = new Event(); String mySubject = (taste.Name + ' - ' + taste.Location__c); // required and default value e.Subject = mySubject; e.StartDateTime = taste.Date_of_Tasting_Start__c; // required e.EndDateTime = taste.Date_of_Tasting_End__c; // required e.WhatId = taste.Id; e.OwnerId = u.Id; myEvent.add(e); } insert(myEvent); } if(Trigger.IsAfter && Trigger.isUpdate && Trigger.Size <2) { for(Tasting__c taste :Trigger.New) { try { Event eve = [SELECT Id, StartDateTime, EndDateTime, WhatId FROM Event WHERE WhatID = :taste.Id LIMIT 1]; eve.StartDateTime = taste.Date_of_Tasting_Start__c; eve.EndDateTime = taste.Date_of_Tasting_End__c; update(eve); } catch(Exception e) { Trigger.newMap.get(taste.Id).addError('No matching event to update'); } } } }
and the testing class
@isTest Private class TestTastingTrigger { @isTest static void TestTasting() { // insert feature Account newAccount = new Account (Name = 'test Account'); insert (newAccount); String acctId = newAccount.Id; Test.startTest(); User u = [Select id, FirstName from User where id =: UserInfo.getUserId() LIMIT 1]; Tasting__c taste = new Tasting__c (Name='Test', Date_of_Tasting_Start__c = System.Now(), Date_of_Tasting_End__c = System.Now(), Account__C = acctId ); insert(taste); //Perform test Event myEvent = [SELECT Id, WhatId FROM Event WHERE WhatId =:taste.Id]; System.assertEquals(taste.Id, myEvent.WhatId); ///////////////////////////////////////////// // test update feature DateTime newStart = taste.Date_of_Tasting_Start__c; newStart = newStart.addDays(1); DateTime newEnd = taste.Date_of_Tasting_End__c; newEnd = newEnd.addDays(1); taste.Date_of_Tasting_Start__c = newStart; taste.Date_of_Tasting_End__c = newEnd; update(taste); myEvent = [SELECT Id, WhatId, StartDateTime, EndDateTime FROM Event WHERE WhatId =:taste.Id]; System.assertEquals(taste.Date_of_Tasting_Start__c, myEvent.StartDateTime); System.assertEquals(taste.Date_of_Tasting_End__c, myEvent.EndDateTime); delete (myEvent); // I'm sure this is cheating try { update(taste); } catch (exception e) {} } }
Thanks,
Your test class looks good and no its not cheating, you basically have simulated what user might do, by deleting the event and updating the taste record, which makes perfect sense.
Line 44, when you delete an event and then update the tasting, it catches the error and adds error on record, which is fine,
BTW, on the other note, the trigger code you have written needs to be revisited, there is a SOQL query and DML updates in the for loop which is not a best practice as it would cause issues when you are updating or inserting more than 200 records at same time
All Answers
Your test class looks good and no its not cheating, you basically have simulated what user might do, by deleting the event and updating the taste record, which makes perfect sense.
Line 44, when you delete an event and then update the tasting, it catches the error and adds error on record, which is fine,
BTW, on the other note, the trigger code you have written needs to be revisited, there is a SOQL query and DML updates in the for loop which is not a best practice as it would cause issues when you are updating or inserting more than 200 records at same time
As it regards to the for loop, I put a if statement in so the for loop only triggers if the trigger.new <2 so bulk updates shouldn't trigger at all right? When I made another test class and put tried to put multiple records in, I didn't see any events get created.
I wasn't sure how to test that in code, so just did it manually.