课程章节介绍
同学们,今天我们来聊一个测试中很常见的“坑”,以及怎么轻松绕过它。简单来说,当你在代码里做了异步操作,比如调用未来方法、批处理,或者定时任务,这些操作内部可能会“卡住”你后面想做的外部调用。
为什么会这样?因为异步 Apex 会把一些还没提交的数据库工作暂时挂起,在这个事务期间,Salesforce 就不让你再做新的 HTTP 调用(也就是 callout)了。这就好比你正在写一封信,还没寄出去,就不让你同时打电话,怕你搞混了。
那在测试代码里怎么办?我们有一个特别好用的工具:Test.startTest 和 Test.stopTest。只要把异步操作包在这两个方法中间,测试系统就会帮你把这些异步工作暂时“扣住”,等到 stopTest 的时候再统一执行。这样一来,你就可以在 stopTest 之后,安安心心地做模拟的 callout,完全不用担心被阻塞。
如果你没有用 startTest 和 stopTest 包住异步调用,那你就得动一下脑:要么把 callout 也放进 startTest/stopTest 里面,要么把 callout 放在外面,但也要符合测试的规则。不过最简单、最推荐的做法,还是把异步操作用 startTest 和 stopTest 包起来,然后模拟的 callout 放在 stopTest 之后去执行,因为它会等到异步处理完毕后触发。
你只需要记住一句话:异步卡呼叫,测试用 start/stop 包,呼叫放后面,模拟轻松搞。
这样,以后写测试的时候就能流畅地处理异步和 callout 混合的场景了。有什么问题,随时问我。
关键词
Apex
Salesforce
Developer Guide