So vermeiden Sie MIX MIXE_DML_OPERATION -Fehler in Salesforce -Tests, die Benutzer erstellen

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

Frage

Manchmal müssen Sie in Salesforce -Tests Benutzerobjekte erstellen, um einen Teil des Tests als spezielle Benutzerart zu führen.

Seit dem Update von Salesforce Summer 08 wird jedoch versucht, sowohl Benutzerobjekte als auch normale Objekte (z. B. Konten) in demselben Test zu erstellen, um den folgenden Fehler zu erstellen:

Mixed_dml_operation, DML-Operation im Setup-Objekt ist nicht zulässig, nachdem Sie ein nicht einsetzendes Objekt aktualisiert haben (oder umgekehrt): Benutzer, Originalobjekt: Konto

Beachten Sie, dass der Fehler nicht auftritt, wenn Sie die Tests von Eclipse/force.com IDE ausführen. Dies geschieht jedoch, wenn Sie sich für Salesforce einsetzen und dann die Tests innerhalb von Salesforce ausführen.

Wie schreibe ich meine Tests neu, um diesen Fehler zu vermeiden?

Hier ist ein einfaches Beispiel für einen Test, der den Fehler verursacht:

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;
    }

}
War es hilfreich?

Lösung

Noch nicht viele Salesforce -Leute hier, denke ich.

Ich habe eine Lösung gefunden, ich weiß nicht, warum sie funktioniert, aber sie funktioniert.

Alle Teile des Tests, die auf normale Objekte zugreifen, müssen in ein System eingewickelt werden.

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

Die in der Frage angegebene Beispiel -text_mixed_dmlbug -Methode wird also:

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;
    }

}

Dann hören die Fehler mixed_dml_operation auf.

Andere Tipps

Es scheint, als hätten Sie eine Problemumgehung gefunden. Ich wollte nur versuchen, zu klären, warum Sie diesen Fehler erhalten.

Ich denke, Sie treffen dieses Problem (per " http://www.salesforce.com/us/developer/docs/apexcode/content/apex_dml_non_mix_sobjects.htm):

Sobjekte, die bei DML -Operationen nicht zusammen verwendet werden können

Einige Sobjekte erfordern, dass Sie DML -Operationen nur für einen Typ pro Transaktion ausführen. Sie können beispielsweise kein Konto einfügen und dann einen Benutzer oder ein Gruppenmitglied in eine einzelne Transaktion einfügen. Die folgenden Schluchzen können in einer Transaktion nicht zusammen verwendet werden:

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

Wichtig ist die Hauptausnahme, wenn Sie die Runas -Methode in einem Test verwenden.

zusätzlich Sommer 08 Versionsnotizen (Dieser Link ist ein PDF) Say:

In früheren Veröffentlichungen können Sie in einer einzelnen Transaktion, in der Auslöser beteiligt sind, DML -Vorgänge bei mehr als einem Suchentyp ausführen. Sie können beispielsweise ein Konto einfügen und dann einen Benutzer einfügen. Ab dem Sommer '08 können Sie nur DML -Operationen in einer einzigen Art von Schluchzen aus der folgenden Liste von Sobjekten ausführen.

Sie können beispielsweise kein Konto einfügen, dann einen Benutzer einfügen oder eine Gruppe aktualisieren und dann ein Gruppenelement einfügen.

  • Gruppe
  • Gruppenmitglied
  • QueuesObject
  • Benutzer
  • Benutzer-Rolle
  • Userterritory
  • Gebiet

Darüber hinaus unterstützen Benutzer und Territorium nun die DML -Vorgänge einfügen und aktualisieren, und UserRole unterstützt nun die DML -Vorgänge des Einfügens, Aktualisierens und Upsert.

Apex -DML -Operationen werden bei folgenden SOBjekten nicht unterstützt:

  • AccountPritoritorySignmentRULE
  • AccountPorritoritorySignmentRuleItem
  • UserAccountTeamMember

Dieses Verhalten ist tatsächlich in der Salesforce -Dokumentation dokumentiert: http://www.salesforce.com/us/developer/docs/apexcode/index_left.htm#starttopic=content/apex_dml_non_mix_sobjects.htm?searchtype. Lesen Sie dort, wo es heißt: "Wichtig Die Hauptausnahme dafür ist, wenn Sie die Runas -Methode in einem Test verwenden."

Fand dies gerade in der Dokumentation:

Andere Verwendungen von runAs

Sie können auch die verwenden runAs Methode zur Durchführung gemischter DML -Operationen in Ihrem Test, indem die DML -Operationen innerhalb des runAs Block. Auf diese Weise umgehen Sie den gemischten DML sObjects. Sehen sObjects Das kann nicht zusammen in DML -Operationen verwendet werden.

Also sieht es aus wie das RunAs Problemumgehung ist keine Problemumgehung, wird jedoch von Salesforce als die einzige Möglichkeit angenommen, durch das gemischte DML -Problem zu gehen.

Hoffe das hilft

Bezug

Dieser Fehler ist so häufig, wenn versucht wird, Benutzer- und andere Objektdatensätze in einer einzelnen Transaktion in Apex zu erstellen.

Problemumgehung in Apex -Klasse/Trigger: Verwenden Sie die zukünftige Methode, um Benutzer zu erstellen, wenn der Fehler auftritt

Problemumgehung in der Testklasse: Versuchen Sie nicht, eine neue Benutzerdaten zu erstellen, stattdessen verwenden))>

Code -Snippet bei -https://thesalesforcedev.blogspot.com/2019/07/mixeddmloperation-dml-operation-on.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top