代码之家  ›  专栏  ›  技术社区  ›  codeulike

在创建用户的Salesforce测试中如何避免混合的DML操作错误

  •  31
  • codeulike  · 技术社区  · 16 年前

    但是,自Salesforce Summer 08更新以来,尝试在同一测试中创建用户对象和普通对象(如帐户)会导致以下错误:

    混合\u DML \u操作,更新非设置对象(反之亦然)后,不允许对设置对象执行DML操作:User,original object:Account

    如何重新编写测试以避免此错误?

    下面是一个导致错误的测试的简单示例:

    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;
        }
    
    }
    
    4 回复  |  直到 15 年前
        1
  •  40
  •   codeulike    16 年前

    我想,这里的销售人员还不多。

    我找到了一个解决办法,我不知道为什么它有效,但它有效。

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

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

    然后混合DML\u操作错误停止发生。

        2
  •  13
  •   Community Mohan Dere    5 年前

    我认为你遇到了这个问题(根据 http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_dml_non_mix_sobjects.htm ):

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

    重要的是 这是您使用runAs的时候 测试中的方法。

    此外 Summer 08 Release notes

    涉及触发器的事务, 例如,您可以插入一个帐户, 然后插入一个用户。从夏天开始 08年,你只能执行DML 从下面的对象列表中。

    帐户,然后插入用户,或更新 一个组,然后插入一个组

    • 集团成员
    • 用户
    • 用户角色
    • 用户区域

    此外,用户和地域现在 支持插入和更新DML 操作和用户角色 现在支持insert、update和delete

    不支持Apex DML操作

    • 会计地域分配规则
    • AccountTerritoryAssignmentRuleItem项目
        3
  •  7
  •   Jorge    14 年前

    此行为实际上记录在salesforce文档中: http://www.salesforce.com/us/developer/docs/apexcode/index_Left.htm#StartTopic=Content/apex_dml_non_mix_sobjects.htm?SearchType . 读上面写着“重要”的地方

        4
  •  1
  •   Milo Sherif Reda    8 年前

    其他用途 runAs

    您也可以使用 方法通过将DML操作封装在 符文 阻止。通过这种方式,您可以绕过混合DML错误,否则在插入或更新安装程序对象以及其他对象时会返回该错误 sObjects . 看到了吗 对象

    所以看起来 RunAs

    希望这有帮助

    Reference

        5
  •  0
  •   Hoda Danish    6 年前

    在apex中尝试在单个事务中创建用户和其他对象记录时,此错误非常常见。

    测试类中的解决方法:不要尝试创建新的用户数据,而是使用()>

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