如何在运行测试类时停止托管触发器的执行?
Posted
技术标签:
【中文标题】如何在运行测试类时停止托管触发器的执行?【英文标题】:How can I stop a managed trigger from executing while running a test class? 【发布时间】:2012-02-19 20:35:17 【问题描述】:通常,当触发器运行时,我们会检查用户的配置文件类型,如果是我们不希望触发器运行的类型,那么我们会在运行任何其他代码之前退出触发器。
问题:我们安装了一个从其他公司购买的 SF 包,它的所有代码对我们都是不可见的,并且不可编辑。除了通过 UI 手动禁用它们之外,我们如何阻止其中一些触发器运行?我想在运行测试类时暂时禁用它们。
正在考虑做这样的事情,但收到错误消息“ApexTrigger 上不允许 DML。”
ApexTrigger at = [select id from ApexTrigger where name='SomeTriggerName'];
at.status = 'Inactive';
update at;
【问题讨论】:
您是否有充分的理由想要禁用它?我知道测试覆盖率很痛苦,但它应该测试一个真实世界的场景——如果触发器要在现实世界中运行,你要确保你的代码可以使用它! 我需要禁用它的原因是因为测试类检查了很多场景,并且打包的触发器运行了多个 SOQL 语句,我无法控制这些语句的执行。在我将测试覆盖率提高到 100% 之前,SOQL 查询计数达到了打包命名空间中的调控器限制 100。 【参考方案1】:我相信您唯一的选择是卸载或取消部署受管软件包。
【讨论】:
【参考方案2】:我试过做类似的事情,但卡住了。我不相信有办法在不让受管软件包的所有者更新 Apex 代码的情况下完成您的要求。
您在问题之前列出的方法是一个很好的解决方案;不过,我建议另外使用Custom Settings。您可以建议触发器的所有者/开发人员在执行触发器之前实施自定义设置检查。对于我自己的一些触发器,这是我能想到的最佳解决方案。
如果 ApexTrigger 对象可以更新就好了,但 Salesforce 不允许。
【讨论】:
以上是关于如何在运行测试类时停止托管触发器的执行?的主要内容,如果未能解决你的问题,请参考以下文章
测试类时,使用 Junit 和 Mockito 检查方法内部的工作
python+selenium 在执行测试脚本时,遇到错误如何能继续执行下去而不停止