Thanks for your quick reply.But I havn't use any emai template .When we have run the test class we have got the error like "System.QueryException: List has more than 1 row for assignment to SObject".Please help me on this. Thanks
Hi Srini, This error comes when your list does not have any records. Try this sample code with your code Use the sample code given below to avoid the error :
List<Event> ev = [Select WhoId, Whatid, OwnerId from Event where WhoId = :t.Id];
if(ev.size() > 0) { //your logic here }
If the problems not solve yet so post your code here.I will look on it.
Hi Himanshu. My requirement is (If we assign a task to someone else, we can get an automated notice when the task is completed) For that we have created one trigger on Task Object Please find teh below trigger and based on that please help me the test class .
Please have look in to my trigger .
trigger TaskCompletedTrigger on Task (before update ) { Set<Id> ownerIds = new Set<Id>(); for(Task tsk: Trigger.New){ if(tsk.Status=='Completed' && Trigger.oldMap.get(tsk.Id).Status != 'Completed'){ ownerIds.add(tsk.CreatedById); } } Map<Id, User> userMap = new Map<Id,User>([select Name, Email from User where Id in :ownerIds]);
List<Messaging.SingleEmailMessage> emailMsglist=new List<Messaging.SingleEmailMessage>(); for(Task tsk : Trigger.New) { if(tsk.Status=='Completed' && Trigger.oldMap.get(tsk.Id).Status != 'Completed'){ User theUser = userMap.get(tsk.CreatedById); Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {theUser.Email}; mail.setToAddresses(toAddresses); mail.setSubject('A task has been updated'); String template = 'Hello {0}, \nYour task has been Completed. Here are the details - \n\n'; System.debug('========================'+template);
@isTest(SeeAllData=true) public class TaskCompletedTriggerTaskTest { public static testMethod void unitTest(){ Test.startTest(); EmailTemplate template = [SELECT id FROM EmailTemplate WHERE DeveloperName = 'Supp ortSelfServiceNewLoginandPassword']; Task task= new task(); task.Subject='Message Sent'; task.status='Completed'; insert task; task.status='In Progress'; update task; Test.stopTest(); } }
Thae above test class code is passed but code coverage it is showing 36%
not covered lines are
ownerIds.add(tsk.CreatedById); and
User theUser = userMap.get(tsk.CreatedById); Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {theUser.Email}; mail.setToAddresses(toAddresses); mail.setSubject('A task has been updated'); String template = 'Hello {0}, \nYour task has been Completed. Here are the details - \n\n'; System.debug('========================'+template);
my test execution is passed but test execution says: Could not run tests on class 01p220000008ZFY(or whatever the Id is of the test I'm trying to run).Any ideas? Thanks
As you know as of now test code is working fine,but yester day we have added the two lines of code in the main trigger, but after adding the bit of code trigger is working fine, but that wolud effecting in the test class.Now code coverage is showing 32%. can you please help me on this.The one which we are added in the trrigger mentioned below
template+= '\n\nFor more details, click the following link: \n\n'; template+= URL.getSalesforceBaseUrl().toExternalForm() + '/' + tsk.Id;
Below is the test calss:
@isTest(SeeAllData=true) public class TaskEmailNotificationTest{ static testMethod void Test(){ Test.startTest(); EmailTemplate template = [SELECT id FROM EmailTemplate WHERE DeveloperName = 'ContactFollowUpSAMPLE']; Task task= new task(); task.Subject='Message Sent'; task.status='In Progress'; insert task; task.status='Completed'; update task; Test.stopTest(); } }
if(tsk.Status=='Completed' && Trigger.oldMap.get(tsk.Id).Status != 'Completed'){
so, in test class you need to put task status other than completed (may be in progress) while inserting it. And update it by completed status.
Task task= new task(); task.Subject='Message Sent'; task.status='In Progress'; insert task;
task.status='Completed'; update task;
Try this hope this help to get your code covered.
All Answers
Try this code
@isTest(SeeAllData=true)
public class TestemailonDuedate {
public static testMethod void unitTest(){
Test.startTest();
EmailTemplate template = [SELECT id FROM EmailTemplate WHERE DeveloperName = 'Template_Name'];
Task tsk=new Task();
tsk.ActivityDate=System.Today();
tsk.Subject='Test';
tsk.Status='In Progress';
tsk.Priority='Normal';
Insert tsk;
System.assertEquals(tsk.Subject,'Test');
Test.stopTest();
}
}
Hope this helps you.
Thanks for your quick reply.But I havn't use any emai template .When we have run the test class we have got the error like "System.QueryException: List has more than 1 row for assignment to SObject".Please help me on this.
Thanks
This error comes when your list does not have any records.
Try this sample code with your code
Use the sample code given below to avoid the error :
List<Event> ev = [Select WhoId, Whatid, OwnerId from Event where WhoId = :t.Id];
if(ev.size() > 0)
{
//your logic here
}
If the problems not solve yet so post your code here.I will look on it.
My requirement is (If we assign a task to someone else, we can get an automated notice when the task is completed) For that we have created one trigger on Task Object Please find teh below trigger and based on that please help me the test class .
Please have look in to my trigger .
trigger TaskCompletedTrigger on Task (before update ) {
Set<Id> ownerIds = new Set<Id>();
for(Task tsk: Trigger.New){
if(tsk.Status=='Completed' && Trigger.oldMap.get(tsk.Id).Status != 'Completed'){
ownerIds.add(tsk.CreatedById);
}
}
Map<Id, User> userMap = new Map<Id,User>([select Name, Email from User where Id in :ownerIds]);
List<Messaging.SingleEmailMessage> emailMsglist=new List<Messaging.SingleEmailMessage>();
for(Task tsk : Trigger.New) {
if(tsk.Status=='Completed' && Trigger.oldMap.get(tsk.Id).Status != 'Completed'){
User theUser = userMap.get(tsk.CreatedById);
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {theUser.Email};
mail.setToAddresses(toAddresses);
mail.setSubject('A task has been updated');
String template = 'Hello {0}, \nYour task has been Completed. Here are the details - \n\n';
System.debug('========================'+template);
template+= 'Subject -'+tsk.Subject+' \n';
template+= 'Status - '+tsk.Status +' \n';
List<String> args = new List<String>();
args.add(theUser.Name);
String formattedHtml = String.format(template, args);
mail.setPlainTextBody(formattedHtml);
emailMsglist.add(mail);
}
}
Messaging.SendEmail(emailMsglist);
}
public static testMethod void unitTest(){
Test.startTest(); EmailTemplate template = [SELECT id FROM EmailTemplate WHERE DeveloperName = 'Supp ortSelfServiceNewLoginandPassword'];
Task task= new task(); task.Subject='Message Sent'; task.status='Completed'; insert task; task.status='In Progress'; update task; Test.stopTest();
}
}
Thae above test class code is passed but code coverage it is showing 36%
not covered lines are
ownerIds.add(tsk.CreatedById); and
User theUser = userMap.get(tsk.CreatedById);
Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
String[] toAddresses = new String[] {theUser.Email};
mail.setToAddresses(toAddresses);
mail.setSubject('A task has been updated');
String template = 'Hello {0}, \nYour task has been Completed. Here are the details - \n\n';
System.debug('========================'+template);
template+= 'Subject -'+tsk.Subject+' \n';
template+= 'Status - '+tsk.Status +' \n';
List<String> args = new List<String>();
args.add(theUser.Name);
String formattedHtml = String.format(template, args);
mail.setPlainTextBody(formattedHtml);
emailMsglist.add(mail);
the above code is not covered
Thanks
if(tsk.Status=='Completed' && Trigger.oldMap.get(tsk.Id).Status != 'Completed'){
so, in test class you need to put task status other than completed (may be in progress) while inserting it. And update it by completed status.
Task task= new task(); task.Subject='Message Sent'; task.status='In Progress'; insert task;
task.status='Completed'; update task;
Try this hope this help to get your code covered.
Wow. now it's coverd 100%
Thanks again!
I have one More issue on this
my test execution is passed but test execution says: Could not run tests on class 01p220000008ZFY(or whatever the Id is of the test I'm trying to run).Any ideas?
Thanks
try this link: https://success.salesforce.com/issues_view?id=a1p30000000T0FeAAK
https://success.salesforce.com/issues_view?id=a1p30000000T091AAC
Hi Himanshu,
Thanks for your help!....
Am Sorry for that unfortunately am unseleted that!.....
As you know as of now test code is working fine,but yester day we have added the two lines of code in the main trigger, but after adding the bit of code trigger is working fine, but that wolud effecting in the test class.Now code coverage is showing 32%. can you please help me on this.The one which we are added in the trrigger mentioned below
template+= '\n\nFor more details, click the following link: \n\n';
template+= URL.getSalesforceBaseUrl().toExternalForm() + '/' + tsk.Id;
Below is the test calss:
@isTest(SeeAllData=true)
public class TaskEmailNotificationTest{
static testMethod void Test(){
Test.startTest();
EmailTemplate template = [SELECT id FROM EmailTemplate WHERE DeveloperName = 'ContactFollowUpSAMPLE'];
Task task= new task();
task.Subject='Message Sent';
task.status='In Progress';
insert task;
task.status='Completed';
update task;
Test.stopTest();
}
}
Please help me on this.
Thanks in advance