Performing DML Operations and Mock Callouts

DEX455 - Apex 集成与工具完全指南:Callouts、命名凭据、WSDL2Apex、Mock 测试

📄 第 378 页 🎬 视频课程

课程章节介绍

你知道吗,在写测试代码时,经常会遇到一个很烦人的限制: 如果你在一个事务里先做了数据操作,比如插入、更新记录,这些操作会让系统产生“未提交的工作”。接着如果你马上要发起一个 HTTP 调用,系统就会报错——因为它不允许在有未提交工作的情况下进行调用。 那怎么绕过这个限制呢? 答案就是,用好 Test.startTest 和 Test.stopTest 这两个老朋友,。 具体做法是: - 把你要,模拟的调用,(就是被测代码里的呼叫外部系统那部分)放在 `Test.startTest` 和 `Test.stopTest` 之间。 - 那些,会产生未提交工作的事务性操作,,必须写在 `Test.startTest` ,之前,,不能放在这个块里。 - 而且别忘了,`Test.setMock` 语句要写在 `Test.startTest` 的,前面,,顺序不能错。 为什么这样就能工作呢? 因为 `Test.startTest` 会把之前所有挂起的操作提交掉,并开启一个全新的测试上下文,这样后面的调用就没有未提交工作的阻碍了。 还有一点可以放心: 调用完成之后,如果再发生事务操作,是允许的,不需要做任何调整,系统不会管你。 简单总结就是:,先办事(DML),再开块(start/stop),模拟调用放中间,setMock 放最前。, 这样你的测试就能顺畅运行啦。

关键词

Apex Salesforce Developer Guide