You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Salesforce APEX REST单元测试查询Case对象返回空结果问题排查

解决Apex单元测试中Case查询为空的权限与数据问题

首先得戳破最核心的问题:你的测试环境里根本没有要查询的Case记录!

Salesforce的单元测试完全运行在隔离的测试沙箱中,不会读取生产/沙箱的真实业务数据。你硬编码查询CaseNumber = '00001026'的Case,但这个记录在测试环境里不存在,返回空列表是必然结果。权限问题是次要的,先解决数据问题,再调整权限配置。

一、先补上测试数据(最关键一步)

在测试方法中手动创建测试用的Case记录,并且确保测试用户能访问它。比如:

// 在测试方法开头添加:创建测试Case
Case testCase = new Case(
    Status = 'New', // 必填字段,根据你的Org配置调整
    Origin = 'Email',
    Subject = 'Test Case for API',
    OwnerId = UserInfo.getUserId() // 先临时用当前测试运行用户
);
insert testCase;

二、权限配置的正确姿势

你用了System.RunAs()但没生效,可能有这几个原因:

  • Profile权限不足:检查StandardTestUser这个Profile是否拥有Case对象的Read权限,以及Id、CaseNumber字段的Read权限(这俩通常默认开放,但最好去Profile的字段权限里确认)。如果需要跨用户访问Case,给这个Profile加上View All Cases权限。
  • 测试用户无法访问测试Case:如果Profile没有View All权限,记得把测试Case的Owner改成RunAs里的测试用户,确保用户对这条记录有访问权:
    System.RunAs(pu) {
        testCase.OwnerId = pu.Id;
        update testCase;
        // 后续的REST请求和查询逻辑...
    }
    

三、修复后的完整测试代码示例

@isTest private class MyRestResource1Test {
    static testMethod void MyRestRequest() {
        // 1. 创建测试用Case(测试环境无真实数据,必须手动生成)
        Case testCase = new Case(
            Status = 'New',
            Origin = 'Phone',
            Subject = 'API Test Case'
        );
        insert testCase;

        // 2. 创建测试用户
        String uniqueUserName = 'standarduser' + DateTime.now().getTime() + '@testorg.com';
        Profile p = [SELECT Id FROM Profile WHERE Name='StandardTestUser'];
        User pu = new User(
            Alias='standt',
            Email='standarduser@testorg.com',
            LastName='testing',
            EmailEncodingKey='UTF-8',
            LanguageLocaleKey='en_US',
            LocaleSidKey='en_US',
            ProfileId=p.Id,
            TimeZoneSidKey='America/New_York',
            UserName=uniqueUserName
        );
        insert pu;

        System.RunAs(pu) {
            // 确保测试用户拥有该Case的访问权
            testCase.OwnerId = pu.Id;
            update testCase;

            // 3. 构造REST请求
            RestRequest req = new RestRequest();
            RestResponse res = new RestResponse();
            req.requestURI = '/services/apexrest/sfcheckap/';
            req.addParameter('useremail','testuserid@red.com');
            req.addParameter('casenumber', testCase.CaseNumber); // 用测试Case的真实编号
            req.httpMethod = 'GET';
            RestContext.request = req;
            RestContext.response = res;

            Test.startTest();
            Map<String, Boolean> resultMap = MyRestResource1.doGet();
            Test.stopTest();

            // 4. 断言验证
            Boolean debugflag = resultMap.get('accessPermission');
            System.assert(debugflag, 'Access permission should be granted for test case');
        }
    }
}

四、你关心的其他问题解答

  1. 是否与Tooling API相关?
    完全无关。Tooling API是用来操作Salesforce元数据(比如修改Profile、创建Apex类)的工具,你的问题是测试数据隔离和对象权限的基础问题,和Tooling API没有任何关联。

  2. 如何配置单元测试对Case及字段的读取权限?

  • 给测试用户的Profile分配Case对象的Read权限;
  • 确保Profile对Case的Id、CaseNumber字段有Read权限(通常默认开启,可在Profile的字段权限设置中确认);
  • 如果需要跨用户访问Case,给Profile添加View All Cases权限,或者将测试Case的Owner设置为测试用户。

内容的提问来源于stack exchange,提问作者Claude Falbriard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:46:47