Using the runAs Method

DEX455 - Apex 测试完全指南:单元测试、代码覆盖与 Mock 框架

📄 第 452 页 🎬 视频课程

课程章节介绍

好,咱们今天来聊聊测试里一个特别好用的功能,叫 `System.runAs()`。 你想象一下,平时在测试代码里,你写的逻辑都是以当前登录用户——也就是运行测试的那个“你”——的身份去跑。但真实场景里,不同的用户看到的、能做的操作可是完全不一样的。有的人能编辑合同,有的人只能看个草稿;有的能看到敏感字段,有的连那个字段长啥样都看不见。 那怎么在测试里模拟“换个用户”呢?就是靠 `System.runAs()`。 你只要把一段测试逻辑包在 `System.runAs(某个用户)` 里面,Salesforce 就会立刻把当前上下文切换成这个用户的权限。无论是共享规则,还是对象级别的增删改查权限,甚至具体到某个字段能不能见、能不能改,都会严格按那个用户的设置来执行。就算你的测试类本身是无共享模式(也就是没有 `with sharing`),只要进了 `runAs` 的块,照样会强制检查这个用户的共享规则。 所以它特别适合验证权限控制写得对不对。 而且这个 `runAs` 用起来很灵活。你可以在里面再嵌套一个 `runAs`,就像一层套一层的俄罗丝套娃——每进入一层,身份就切一次,适合测试复杂的权限叠加场景。 还有一个很实用的地方:`runAs` 会直接忽略用户许可证的限制。也就是说,你可以在测试里临时创建一个用户,即使那个用户的许可证不够,你也照样能以他的身份去跑代码,不用真去买个额外的许可证。 但要注意,每次你调用 `runAs`,它都会算进你的测试方法里的 “TLR声明限制” 里。TLR 的全称是 Test Limit Resource,可以理解成测试里的资源配额,比如 DML 语句次数、查询条数等等。`runAs` 的每次调用会占用这个配额,所以别写个无限循环在里面切用户,会超限的。 再讲一个特别好用的场景——你可以用它来绕过混合 TLR 错误。什么意思呢?有时候你在一个测试方法里,既做了“设置类”的操作(比如调用 `Test.startTest()` 之前的那些准备数据),又想在同一个上下文里做其他的治理限制计数操作,可能会触发“混合 TLR”错误。这时候,你可以把其中一部分操作塞进 `runAs` 块里,Salesforce 就会把它们隔离开,帮你避免这个报错。 最后,如果你的代码涉及到托管包的不同版本,`runAs` 还有一个重载版本,你可以传一个 `System.Version` 进去,这样就能模拟在指定版本的托管包环境里测试行为。这在对 AppExchange 做升级兼容性测试时特别有用。 好,简单回顾一下: - `runAs` 用来临时切换用户上下文,强制应用那个用户的全部权限。 - 可以嵌套使用,不管测试类的共享模式。 - 每个 `runAs` 消耗 TLR 声明限制,并忽略许可证限制。 - 能隔离操作,避免混合 TLR 错误。 - 支持指定托管包版本去测试。 下一张 slide 我们来看看具体的代码例子。

关键词

Apex Salesforce Developer Guide