Я новичок в разработке Salesforce, и мне нужна помощь с приведенным ниже кодом. Логика кода заключается в том, чтобы назначить Service Writer (пользователя) объекту учетной записи в Round Robin. Я создал очередь и пользовательские настройки для назначения пользователей на основе значения индекса. Тестовый класс прост (обязательные поля для вставки), но при выполнении тестового класса я получаю следующую ошибку:

Не могли бы вы помочь?

Ошибка:

System.DmlException: Ошибка вставки. Первое исключение в строке 0; первая ошибка: CANNOT_INSERT_UPDATE_ACTIVATE_ENTITY, AccountTrigger: выполнение BeforeInsert

вызвано: System.DmlException: Ошибка обновления. Первое исключение в строке 0; первая ошибка: MISSING_ARGUMENT, идентификатор не указан в вызове обновления: []

Class.AccountTriggerHandler.populateSWclass: строка 38, столбец 1 Class.AccountTriggerHandler.onBeforeInsert: строка 3, столбец 1

public class AccountTriggerHandler {
    public static void onBeforeInsert(List<Account> newAccounts){
        populateSWclass(newAccounts, null); 
    }
    public static void onBeforeUpdate(List<Account> newAccounts, Map<Id, Account> oldAccountsMap){
        populateSWclass(newAccounts, oldAccountsMap);
    }
    
 
 public static void populateSWclass (List<Account> newAccounts, Map<Id, Account> oldAccountsMap){
        for(Account acc: newAccounts){
            
            if (acc.Region__c == 'Boston'){
              
             // Get the queue user details 
                List<Group> queues = [SELECT Id,
                                     (Select Id, UserOrGroupId FROM GroupMembers Order By ID ASC) 
                                     FROM Group 
                                     Where Type = 'Queue' AND DeveloperName = 'SW_Boston_Queue'];
                //Custom settings
                SW__c SWA = SW__c.getOrgDefaults();
                Integer userIndex = (SWA.get('User_Index_Boston__c') == null || Integer.valueOf(SWA.get('User_Index_Boston__c')) < -1) ? -1 : Integer.valueOf(SWA.get('User_Index_Boston__c'));
             
                                     
                if(queues.size() > 0 && queues.get(0).GroupMembers.size() > 0){
                    
                    Id queueId = queues.get(0).Id;
                    Integer groupMemberSize = queues.get(0).GroupMembers.size();
                    Integer SWAUserIndex =  (userIndex + 1) >= groupMemberSize ? 0 : userIndex + 1;
                  //update user in account 
                    acc.Service_Writer__c = queues.get(0).GroupMembers.get(SWAUserIndex).UserOrGroupId;
                    
                    userIndex = SWAUserIndex;
                    
                // Update the custom settings user index with the last assigned user
                   
                    SWA.User_Index_Boston__c = userIndex; 
                    update SWA;
                   
                }
            }
        }
 }
 
0
Ysr Shk 19 Авг 2020 в 11:18

1 ответ

Пользовательские настройки аналогичны объектам SObject в тестовых классах, поскольку у вас нет доступа к существующим записям, если вы не пометите тестовый класс с помощью @IsTest(SeeAllData=true). Поэтому SW__c.getOrgDefaults() не вернет существующую запись, которую можно обновить.

В вашем случае у вас есть три варианта:

  1. Вставьте настройки по умолчанию в свой метод тестирования insert new SW__c (SetupOwnerId = Userinfo.getOrganizationId())
  2. Измените update SWA на upsert SWA, чтобы пользовательская настройка была вставлена, если она еще не существует.
  3. Добавьте @IsTest(SeeAllData=true), чтобы использовать настройки вашей реальной организации по умолчанию.
0
akiradev 16 Авг 2020 в 00:49
3
Стоит отметить, что, хотя вариант № 3 является вариантом, использование seeAllData=true является очень плохой практикой. Это нарушает концепцию «изоляции тестовых данных» и может привести к трудным для отладки ошибкам (например, развертывание между рабочими песочницами, но не из песочницы в рабочую среду). Это необходимое зло в нескольких очень специфических случаях. Это не один из них.
 – 
Derek F
16 Авг 2020 в 02:41