有时在Salesforce测试中,您需要创建User对象以作为特定类型的用户运行部分测试.
但是,自Salesforce Summer 08更新以来,尝试在同一测试中创建User对象和普通对象(如Accounts)会导致以下错误:
MIXED_DML_OPERATION,更新非安装对象后,不允许对安装对象进行DML操作(反之亦然):用户,原始对象:帐户
请注意,从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;
}
}
Run Code Online (Sandbox Code Playgroud) 我们正在研究如何设置适当的部署过程.
从我所读到的,似乎有4种方法可以做到这一点.
有没有人对各种方法的限制有所建议.
你能在Web Interface包中包含所有内容吗?
我们希望部署以下项目:
Apex课程
Apex触发器
工作流程
邮件模板
MailMerge模板 - 似乎无法在Eclipse中找到它们
自定义字段
页面布局
RecordTypes(似乎无法在网站或Eclipse中找到这些)
PickList项目?
SControls
显然,Salesforce.com中Apex的Spring '12/v24.0版本的新功能是单元测试不再能够访问"真实"数据 - 因此(如果我正确理解了更改)SOQL查询将会现在只检索在单元测试过程中插入的对象 - 甚至是受到一些限制的.
无论如何,这似乎将OpportunityLineItem测试抛出窗口,因为:
我真的希望我至少得到这四点中的一个错误,但到目前为止,我现有的单元测试没有任何变化表明它们中的任何一个都是错的.这当然意味着我的单元测试不再有效.这件事发生在一夜之间 - 周五我的沙盒中的测试运行良好,现在他们失败了.
我错过了什么,或者这是新SFDC版本中的错误?
我正在使用Web服务将我们的后端系统与Salesforce集成.我在不同的URL上运行生产和舞台环境.我需要能够使Web服务调用的端点不同,具体取决于代码是在生产环境还是沙箱Salesforce实例中运行.
我如何检测环境.
目前我正在考虑查找用户以查看用户名是否以'devsandbox'结尾,因为我无法识别我可以查询以获取环境的系统对象.
进一步澄清:
我需要确定的位置在我在Salesforce中选择按钮时调用的Apex代码中.我的自定义控制器需要知道它是否在生产或沙箱Salesforce环境中运行.
使用Apex,我想分割一个字符串,然后使用'AND'运算符作为分隔符重新加入它.
我成功地拆分了字符串,但重新加入了它的问题.
String [] ideaSearchText = searchText.Split(' ');
// How to rejoin the array of strings with 'AND'?
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
有没有办法检测插入的记录是否是触发器中克隆操作的结果?
作为托管包的一部分,我想在克隆Opportunity和OpportunityLineItem记录时清除一些自定义字段.
或者是一个触发器不是防止某些字段被克隆的正确位置?
我曾考虑过创建专用代码来调用sObject.Clone()并排除不需要的字段.这似乎不是托管包的理想解决方案,因为它还会排除Opportunity上的任何其他自定义字段.
在visualforce页面中,我需要检索组织的salesforce实例的URL,而不是视觉强制URL.
例如,我需要https://cs1.salesforce.com而不是https://c.cs1.visual.force.com
这是我到目前为止所尝试的以及我得到的结果:
从VF页面访问Site全局变量:
<apex:outputText value="{!$Site.Domain}" /> 回报 null
旁注:一切$Site.xxx似乎都回归了null.
来自Apex控制器:
Run Code Online (Sandbox Code Playgroud)public String getSfInstance() { return ApexPages.currentPage().getHeaders().get('Host'); }
和
Run Code Online (Sandbox Code Playgroud)public String getSfInstance() { return URL.getSalesforceBaseUrl().toExternalForm(); }
返回c.cs1.visual.force.com和https://c.cs1.visual.force.com分别.
问题:如何检索我想要的内容:https://cs1.salesforce.com?
使用SOAP API与salesforce.com(SFDC)一起工作时,底层数据库中的主键似乎是Id.好吧,这个值的两个表示似乎是15个字符版本或18个字符版本.
我一直在使用18,因为它显然更具体,但最后三位数中包含的是什么,它们可以被丢弃,看起来呢?
任何人都明白这是什么一回事?
如果有人可以指导我检查更新调用中是否包含特定字段是否包含在更新前/后更新触发器中,我将非常感激.非常感谢.
Salesforce中是否有任何方法可以在包或命名空间下对apex类进行分组?我们可以将托管包用于内部组织目的吗?
apex-code ×10
salesforce ×10
triggers ×2
controllers ×1
deployment ×1
force.com ×1
sandbox ×1
soap ×1
unit-testing ×1
visualforce ×1