课程章节介绍
大家好,我们接着来看这一页的内容,讲的是 Apex 里的报告方法在执行时的一些特殊行为,尤其在写测试的时候非常关键。
首先你要记住一点,报告 Apex 方法不是以系统模式运行的。所谓系统模式,就是可以无视权限、访问所有数据的那种超级模式,但报告不是。报告是在当前用户的上下文中运行的,这个用户也叫上下文用户,其实就是登录的那个用户。所以,报告方法能访问到的数据,就是当前登录用户能看到的东西。他自己有什么权限,报告就展示什么,跟他在界面上打开报告是一样的逻辑。
那到了写测试的时候,情况就有点特殊了。我们通常可以通过 SeeAllData 注解来控制测试类能不能看到组织里预先存在的数据。但报告在测试里非常特别,不管你把这个注解设成 true 还是 false,它都直接忽略。也就是说,报告在测试里总是能看到真实环境中已有的数据,即便你写了 SeeAllData=false 也没用。那结果里会混进很多你不想看到的历史数据,所以你得在报告定义本身加好过滤器,用过滤条件把结果限定在你需要的数据上,这是控制结果的唯一可靠办法。
还有一个非常重要的运行时机:在 Apex 测试里,如果你用的是同步报告,比如直接调 runReport 这种,那它不会马上执行,而是会延迟到 Test.stopTest 被调用时才真正跑起来。也就是说,你必须在测试方法里调用 Test.stopTest 之后,报告才会执行,然后你才能拿到最终的结果去做断言。
总结一下就是:报告 Apex 方法跟着用户权限走;测试里它无视 SeeAllData;过滤全靠报告自身的筛选条件;同步报告要等到 Test.stopTest 之后才真正运行。这几个点记牢了,以后处理报告相关的测试就不容易踩坑啦。
关键词
Apex
Salesforce
Developer Guide