2015-03-16 6 views
0

Я написал ниже класс Apex, который обрабатывает входящую электронную почту, отправленную на адрес электронной почты, и создает новую задачу из входящей почты, а затем связывает эту новую задачу с соответствующей записью в salesforce. Матч выполнен по имени записи и входящему элементу электронной почты. Класс также отправляет электронное письмо с уведомлением пользователя «Назначено», что они получили ответ по запросу, над которым они работают.Как написать тестовый класс для класса apache.SingleEmailMessage?

Это прекрасно работает в Sandbox, но у меня нет опыта написания тестовых классов. Может ли кто-нибудь посоветовать, как я пишу тестовый класс для ниже?

global class RequestEmailHandler implements Messaging.InboundEmailHandler { 
global Messaging.InboundEmailResult handleInboundEmail(Messaging.InboundEmail email, Messaging.InboundEnvelope envelope) { 
    Messaging.InboundEmailResult result = new Messaging.InboundEmailresult(); 
    String myPlainText = email.plainTextBody; 
    String subject = email.fromName + ' - ' + email.subject; 
    system.debug(email); 

    subject = subject.left(255); 
    Request__c request; 


    if (subject != null && subject.trim().length() > 0 && subject.indexOf('(R-') > 0) { 
     Integer idx = subject.indexOf('(R-'); 
     String requestName = subject.substring(idx+1, subject.indexOf(')', idx)); 
     request = [SELECT Id, Assigned_To__c FROM Request__c WHERE Name = :requestName]; 
    } 

    if (request == null) { 
     result.message = 'We were unable to locate the associated request.This may be due to the unique "R" number being removed from the subject line.\n Please include the original email subject when replying to any emails.'; 
     result.success = false; 
     return result; 
    }    

    // Add the email plain text into the local variable  
    Task task = new Task(
     WhatId = request.Id, 
     Description = myPlainText, 
     Priority = 'Normal', 
     Status = 'Completed',   
     Type = 'Email', 
     Subject = subject, 
     ActivityDate = System.today(), 
     RecordTypeId = '01250000000HkEw'); 
    insert task; 


    //Find the template 
    EmailTemplate theTemplate = [select id, name from EmailTemplate where DeveloperName = 'New_Email_Reply2']; 
    //Create a new email right after the task 
    Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); 

    //Add email To addresses to list 
    List<String> toAddresses = new List<String>(); 
    toAddresses.add(email.fromAddress); 
    //Set the list of to addresses 
    mail.setToAddresses(toAddresses); 
    //Set the template id 
    mail.setTemplateId(theTemplate.id); 
    //The Id of the user 
    mail.setTargetObjectId(request.Assigned_To__c); 
    //Set the id of the request 
    mail.setWhatId(request.Id); 
    //If you need the email also saved as an activity, otherwise set to false 
    mail.setSaveAsActivity(false); 

    //Send Email 
    try { 
     Messaging.sendEmail(new Messaging.SingleEmailMessage[] {mail}); 
    } 
    catch (EmailException e) { 
     system.debug('sendEmail error: ' + e.getMessage()); 
    } 


    // Save attachments, if any 
    if (email.textAttachments != null) 
    { 
     for(Messaging.Inboundemail.TextAttachment tAttachment : email.textAttachments) 
     { 
      Attachment attachment = new Attachment(); 

      attachment.Name = tAttachment.fileName; 
      attachment.Body = Blob.valueOf(tAttachment.body); 
      attachment.ParentId = request.Id; 
      insert attachment; 
     } 

    } 

    //Save any Binary Attachment 
    if (email.binaryAttachments != null) 
    { 
     for(Messaging.Inboundemail.BinaryAttachment bAttachment : email.binaryAttachments) { 
      Attachment attachment = new Attachment(); 

      attachment.Name = bAttachment.fileName; 
      attachment.Body = bAttachment.body; 
      attachment.ParentId = request.Id; 
      insert attachment;  
      return result; 
     } 
    } 
    return result; 
} 

}

Ниже моя попытка, которая только получать покрытия 24%. Я знаю, что отсутствует жизненно важный код, но я недостаточно разбираюсь в тестовых классах, чтобы принять его дальше.

Может ли кто-нибудь помочь?

испытаний Класс

@isTest 
public class testforemail { 
    static testMethod void insertRequest() { 

     Request__c requestToCreate = new Request__c(); 

     requestToCreate.Subject__c= 'test'; 
     requestToCreate.Requested_By_Email__c= '[email protected]'; 

     insert requestToCreate; 



     Messaging.InboundEmail email = new Messaging.InboundEmail(); 
     Messaging.InboundEnvelope envelope = new Messaging.InboundEnvelope(); 

     Request__c testRequest = [select Id,Name from Request__c limit 1]; 
     System.debug(testRequest.Name); 



     email.subject = (testRequest.Name); 
     email.fromName = 'test test'; 
     email.plainTextBody = 'Hello, this a test email body. for testing purposes only.Phone:123456 Bye'; 
     Messaging.InboundEmail.BinaryAttachment[] binaryAttachments = new Messaging.InboundEmail.BinaryAttachment[1]; 
     Messaging.InboundEmail.BinaryAttachment binaryAttachment = new Messaging.InboundEmail.BinaryAttachment(); 
     binaryAttachment.Filename = 'test.txt'; 
     String algorithmName = 'HMacSHA1'; 
     Blob b = Crypto.generateMac(algorithmName, Blob.valueOf('test'), 
     Blob.valueOf('test_key')); 
     binaryAttachment.Body = b; 
     binaryAttachments[0] = binaryAttachment ; 
     email.binaryAttachments = binaryAttachments ; 
     envelope.fromAddress = '[email protected]'; 

     // Add the email plain text into the local variable  
    Task task = new Task(
     WhatId = (testRequest.Id), 
     Description = email.plainTextBody, 
     Priority = 'Normal', 
     Status = 'Completed',   
     Type = 'Email', 
     Subject = (testRequest.Name), 
     ActivityDate = System.today(), 
     RecordTypeId = '01250000000HkEw'); 
    insert task; 



     // setup controller object 
    RequestEmailHandler catcher = new RequestEmailHandler(); 
    Messaging.InboundEmailResult result = catcher.handleInboundEmail(email, envelope); 
    System.assertEquals(true,result.success);  


    } 
} 

ответ

0

Первый шаг заключается в определении того, что строки кода не распространяется на тестовом классе.

Если вы используете Eclipse, вы можете увидеть это из Apex Test Runner View.

Или вы также можете увидеть это с консоли разработчика.

Еще одна вещь, которую вам нужно рассмотреть - это изоляция ваших операций DML в отдельном классе утилиты.

public class TestUtils 
{ 
    // create request objects method here 

    // create task objects method here 
} 

Кроме того, проверьте журналы отладки и убедитесь, что ваш код не кидает каких-либо исключений (т.е. нулевых исключений указателя, DML исключения и т.д.)

Вы должны также добавить утверждения, чтобы проверить, что код ведет себя так, как ожидалось.

Надеюсь, это поможет.

0

Главное, что вам нужно сделать, это проверить как можно больше вариантов использования, как вы можете, с помощью модульных тестов. Итак, настройте данные для конкретного случая и выполните обработку электронной почты. По электронной почте проверьте результат, используя System.assertEquals(). Сделайте отдельные тесты для каждого варианта использования. Затем, если вы не нажмете не менее 75%, проверьте, что не покрыто. Вам, вероятно, не нужен этот код (в случае, если вы охватывали все варианты использования), или не пишите тест для использования, который использует эти строки кода.

Смежные вопросы