3

我的生产环境现在有很多触发器和类。这些都工作得很好,并且正在发挥应有的作用。但是,我无法部署几个新触发器,因为测试类调用了太多未来的方法。我向您保证,我的代码被批量化,以便每次运行只调用一次未来的方法。但是,当通过 IDE 部署触发器时,每个测试都会运行,因此未来的调用会运行太多次。

我已经尝试在我未来的所有调用中放置一个 try/catch,希望如果它确实达到了限制,它只会路由到 catch 方法。尽管出现同样的错误,但它仍然无法部署。

我正在做的主要未来电话只能通过一个类进行参考。这是一个对我的网站执行 ping 操作的 HTTP 调用。

除了完全重新做我所有的测试类之外,有没有什么方法可以避免这个限制?正如您在下面看到的,未来的过多调用是在特定触发器上(default)而不是在特定触发器上发生的。

10:39:15.617|LIMIT_USAGE_FOR_NS|(default)|
Number of SOQL queries: 85 out of 100 ******* CLOSE TO LIMIT
Number of query rows: 1474 out of 50000
Number of SOSL queries: 0 out of 20
Number of DML statements: 19 out of 150
Number of DML rows: 23 out of 10000
Number of script statements: 2370 out of 200000
Maximum heap size: 0 out of 6000000
Number of callouts: 0 out of 10
Number of Email Invocations: 0 out of 10
Number of fields describes: 0 out of 100
Number of record type describes: 0 out of 100
Number of child relationships describes: 0 out of 100
Number of picklist describes: 0 out of 100
Number of future calls: 11 out of 10 ******* CLOSE TO LIMIT
4

1 回答 1

2

如果不查看特定代码,很难判断是哪些路径导致您在测试期间达到未来调用限制。值得探索为什么当前部署中的组件会达到未来的方法限制。

如果您的目标是让测试通过,您可以结合使用Test.isRunningTest()Limits.getFutureCalls()Limits.getLimitFutureCalls()以便在测试期间不会调用未来方法,否则它们会导致要超过的限制。

例如

 if(Test.isRunningTest() && Limits.getFutureCalls() >= Limits.getLimitFutureCalls()) {
     system.debug(LoggingLevel.Error, 'Future method limit reached. Skipping...');
 } else {
     callTheFutureMethod();
 }
于 2012-10-29T20:30:49.363 回答