gpt4 book ai didi

unit-testing - 如何避免在创建用户的Salesforce测试中出现MIXED_DML_OPERATION错误

转载 作者:行者123 更新时间:2023-12-03 08:46:46 25 4
gpt4 key购买 nike

有时,在Salesforce测试中,您需要创建User对象以作为特定类型的用户运行测试的一部分。

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

MIXED_DML_OPERATION, DML operation on setup object is not permitted after you have updated a non-setup object (or vice versa): User, original object: Account



请注意,当您从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;
}

}

最佳答案

我猜现在还没有多少Salesforce人员在这里。

我找到了一个解决方案,我不知道它为什么起作用,但是它起作用了。

测试的所有访问普通对象的部分都需要包装在System.runAs中,该显式使用当前用户,如下所示:

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

}

然后,MIXED_DML_OPERATION错误停止发生。

关于unit-testing - 如何避免在创建用户的Salesforce测试中出现MIXED_DML_OPERATION错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2387475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com