Тестовый класс в Salesforce для триггера - PullRequest
0 голосов
/ 21 мая 2018

Всем доброго времени суток,

Я пытаюсь написать тестовый класс для триггера, который мне помог написать.Триггер использует поле с именем trigger_help__c, поле формулы, полученное из добавления типа возможности и идентификатора учетной записи, и запускается перед вставкой, если в этой учетной записи в течение последних 90 дней была создана возможность такого типа.Если только профиль не является системным администратором.Вот мой триггер:

trigger leadDuplicatePreventer on opportunity(before insert) {
   set<string> settgs = new set<string>();
   list<opportunity> opps = [select id,Trigger_Help__c  from opportunity WHERE CreatedDate = LAST_N_DAYS:90];
   Profile p=[SELECT ID, Name FROM Profile WHERE Id=:userinfo.getProfileId() Limit 1];
   for(opportunity opp : opps){
     if(opp.Trigger_Help__c != null && p.Name <> 'System Administrator'){
	 settgs.add(opp.Trigger_Help__c);
	 }
   }
   
   for(opportunity op : trigger.new){
      if(settgs.contains(op.Trigger_Help__c)){
	     op.adderror('An Opportunity of this type already exists on this Account.  Please contact a system administrator with questions.');
	  }
   
   }


   
}​

У меня проблемы с написанием тестового класса, и я, как всегда, ничего не понимаю.У меня написано следующее, но я заблудился относительно того, что мне действительно нужно делать:

@isTest
private class TestleadDuplicatePreventer {
    @isTest static void TestleadDuplicatePreventerwithOneOpp() {
        Account acct = new Account(Name='Test Account');
        insert acct;
        Opportunity opp = new Opportunity(Name=acct.Name + ' Opportunity',
                                         StageName='Open Opportunity',
                                         CloseDate=System.today().addMonths(1),
                                         Facility__c='Tacoma WA',
                                         Oppty_Type__c='UCO Service',
                                         AccountID=acct.Id);
        insert opp;
        Test.startTest();
        opp= new Opportunity(Name='Opportunity Test',
                            StageName='Open Opportunity',
                            CloseDate=System.today().addMonths(2),
                            Facility__c='Tacoma WA',
                            Oppty_Type__c='UCO Service',
                            Account=[SELECT ID from Account WHERE Account.Name='Test Account']);
        try
        {
            insert opp;
        }
        catch(Exception duplicate)
        {       
        }
        Test.stopTest();
    }

}​

Любая и вся помощь приветствуется !!

1 Ответ

0 голосов
/ 22 мая 2018

Не совсем точно, каковы были ваши требования для вашего проекта, вы, вероятно, можете сделать это без кода, использующего поле накопительной суммы, которое подсчитывает возможности, связанные с учетной записью, имеющей тип, используемый в Trigger_Help__c , а затемпоставить возможность при проверке того, что когда ISNEW () , если Account.Count_Of_Type__c> 0 вызывает проверку, ИЛИ при возможности создать скрытое уникальное поле, которое является объединением учетной записи.id и тип Opportunity, который может быть установлен рабочим процессом или компоновщиком процесса.Это предотвратит добавление дубликатов типов для данной учетной записи.

Но к вашему первоначальному вопросу: в вашем тесте я не вижу, чтобы вы установили поле Trigger_Help__c , если это не установлено автоматизацией.Кроме того, при создании второго оппа вам не нужно выполнять запрос учетной записи, вы можете просто использовать acct.Id из более раннего кода.

Для вашего улова вы должны подтвердить, чтоe.getMessage () - это сообщение, которое вы ожидаете от ошибки добавления в триггере.

Возможно, вам также понадобится сделать отдельное место, где вы запускаете As (admin_user), где admin_user - это пользователь, которого вы создаете вместе с системным администратором.профиль, чтобы гарантировать, что вы не получите ошибку при запуске от имени пользователя с правами администратора, например:

@isTest
private class TestleadDuplicatePreventer {
    @isTest static void TestleadDuplicatePreventerwithOneOpp() {
    Account acct = new Account(Name='Test Account');
    insert acct;
    Opportunity opp = new Opportunity(Name=acct.Name + ' Opportunity',
                                     StageName='Open Opportunity',
                                     CloseDate=System.today().addMonths(1),
                                     Facility__c='Tacoma WA',
                                     Oppty_Type__c='UCO Service',
                                     AccountID=acct.Id);
    insert opp;
    Test.startTest();
    opp= new Opportunity(Name='Opportunity Test',
                        StageName='Open Opportunity',
                        CloseDate=System.today().addMonths(2),
                        Facility__c='Tacoma WA',
                        Oppty_Type__c='UCO Service',
                        AccountId=acct.Id);
    try
    {
        insert opp;
    }
    catch(Exception duplicate)
    {       
       System.assertEquals('An Opportunity of this type already exists on this Account.  Please contact a system administrator with questions.', duplicate.getMessage())
    }
    //this should probably be in a separate test method
    Profile p = [SELECT Id FROM Profile WHERE Name='System Administrator'];
  User u2 = new User(Alias = 'newUser', Email='newuser@testorg.com',
     EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US',
     LocaleSidKey='en_US', ProfileId = p.Id,
     TimeZoneSidKey='America/Los_Angeles', UserName='newuser@testorg.com');

  System.runAs(u2) {
      insert opp;
  }
    Test.stopTest();
}

}

...