Как избежать ошибки Missower_dml_operation в тестах Salesforce, которые создают пользователей

StackOverflow https://stackoverflow.com/questions/2387475

Вопрос

Иногда в тестах SalesForce вам необходимо создать объекты пользователей, чтобы запустить часть теста в качестве типа пользователя SPECIIFC.

Однако после обновления Saleforce Sale 08, пытается создать как пользовательские объекты, так и нормальные объекты (такие как учетные записи) в том же тесте, приводят к следующей ошибке:

Mixed_dml_operation, операция DML на объекте настройки не допускается после обновления объекта Non-Setup (или наоборот): пользователь, оригинальный объект: учетная запись

Обратите внимание, что ошибка не происходит, когда вы запускаете тесты из Eclipse / force.com IDE, но это произойдет при развертывании для Salesforce, а затем запустить тесты в Salesforce.

Как я могу переписать свои тесты, чтобы избежать этой ошибки?

Вот простой пример теста, который вызывает ошибку:

static testMethod void test_mixed_dmlbug() {        
    Profile p = [select id from profile where name='(some profile)'];
    UserRole r = [Select id from userrole where name='(some role)'];
    User u = new User(alias = 'standt', email='standarduser@testorg.com', 
            emailencodingkey='UTF-8', lastname='Testing', 
            languagelocalekey='en_US', 
            localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
            timezonesidkey='America/Los_Angeles', 
            username='standarduser@testorg.com');
    Account a = new Account(Firstname='Terry', Lastname='Testperson');
    insert a;

    System.runAs(u) {
        a.PersonEmail = 'test@madeupaddress.com';
        update a;
    }

}
Это было полезно?

Решение

Я думаю, что не так много продавцов людей.

Я нашел решение, я не знаю, почему он работает, но это работает.

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

User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ];
System.runAs ( thisUser ) {
    // put test setup code in here
}

Итак, пример метода text_mixed_dmlbug приведен в вопросе, станет:

static testMethod void test_mixed_dmlbug() {  
    User u;
    Account a;      
    User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ];
    System.runAs ( thisUser ) {
        Profile p = [select id from profile where name='(some profile)'];
        UserRole r = [Select id from userrole where name='(some role)'];
        u = new User(alias = 'standt', email='standarduser@testorg.com', 
            emailencodingkey='UTF-8', lastname='Testing', 
            languagelocalekey='en_US', 
            localesidkey='en_US', profileid = p.Id, userroleid = r.Id,
            timezonesidkey='America/Los_Angeles', 
            username='standarduser@testorg.com');
        a = new Account(Firstname='Terry', Lastname='Testperson');
        insert a;
    }
    System.runAs(u) {
        a.PersonEmail = 'test@madeupaddress.com';
        update a;
    }

}

Затем ошибки Mixe_dml_operation перестают происходить.

Другие советы

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

Я думаю, что вы бежите в эту проблему (за http://www.salesforce.com/us/developer/docs/apexcode/content/apex_dml_non_mix_sobjects.htm.):

SOBJECTS, которые не могут быть использованы вместе в операциях DML

Некоторые SOBJECTS требуют, чтобы вы выполняли операции DML только на одном типе на транзакцию. Например, вы не можете вставить учетную запись, затем вставить пользователя или член группы в одну транзакцию. Следующие лобъекты не могут быть использованы вместе в транзакции:

* Group1
* GroupMember
* QueueSObject
* User2
* UserRole
* UserTerritory
* Territory

Важно ваше первичное исключение из этого, когда вы используете метод RUNS в тесте.

В дополнение Лето 08 выпускает ноты (Эта ссылка - это PDF), скажем:

В предыдущих выпусках, в одной транзакции, которая включала триггеры, вы можете выполнить операции DML более чем на один тип SOBJECT, например, вы можете вставить учетную запись, затем вставить пользователя. По состоянию на лето '08, вы можете выполнять операции DML только на одном типе SOBJECT из следующего списка лобъектов.

Например, вы не можете вставить учетную запись, затем вставить пользователя или обновить группу, затем вставьте элемент группы.

  • Группа
  • Группа
  • QueuesObject.
  • Пользователь
  • UseRole.
  • Userterrory
  • Территория

Кроме того, пользователь и территория теперь поддерживают операции DML вставки и обновления DML, а USERROLE теперь поддерживает вставку, обновление Deletete и Upsert DML-операций.

Операции APEX DML не поддерживаются на следующих форматах:

  • Бухгалтерректировка
  • Бухгалтерректировка
  • UserACCountTeamMember

Такое поведение фактически задокументировано в документации Salesforce: http://www.salesforce.com/us/developer/docs/apexcode/index_left.htm#starttopic=content/apex_dml_non_mix_sobjects.htm?searchtype.. Отказ Читайте туда, где он говорит «Важное значение первичного исключения, когда вы используете метод runas в тесте»

Просто нашел это в документации:

Другие виды использования runAs

Вы также можете использовать runAs Метод для выполнения смешанных операций DML в вашем тесте, включающее операции DML в пределах runAs блокировать. Таким образом, вы обходите смешанную ошибку DML, которая в противном случае возвращается при вставке или обновлении объектов настройки вместе с другими sObjects. Отказ Видеть sObjects Это не может быть использовано вместе в операциях DML.

Так выглядит как RunAs Обходной путь не является обходным отделением, но считается Salesforce как единственным способом продвижения смешанного DML.

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

Ссылка

Эта ошибка настолько распространена при попытке создания пользователей и других записей объектов в одной транзакции в Apex.

Обходной путь в классе APEX / TRIGGER: используйте метод будущего для создания пользователя при встрече с ошибкой

Обходной путь в классе тестов: не пытайтесь создавать новые пользовательские данные, вместо этого использовать))>

Кодовой фрагмент в -https://thesalesfordev.blogspot.com/2019/07/mixeddmloperation-dml-operation-on.html.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top