REST 服务的 Salesforce APEX 单元测试错误/案例对象 SELECT 处的错误

Salesforce APEX Unit Test Error with REST Services / Error at SELECT of Case Object

我已经成功地使用通过注释定义的 APEX 语言构建了 REST API:@RestResource。

我还用@isTest 注释写了一个匹配的单元测试过程。由带有两个输入参数的 HTTP GET 触发的 REST API 执行效果很好,而单元测试执行 returns 由 SOQL 查询产生的 "null" 值列表如下所示:

String mycase = inputs_case_number; // for ex. '00001026'   
sObject[] sl2 = [SELECT Id, CaseNumber FROM Case WHERE CaseNumber = :mycase LIMIT 1];

查询returns:

VARIABLE_ASSIGNMENT [22]|sl2|[]|0x1ffefea6

我还尝试使用 RunAs() 方法(见下面的代码)执行它,使用动态创建的 Salesforce 测试用户,不是匿名的,连接到更强大的配置文件,但仍然收到 "null" 在 SOQL 查询中回答。新配置文件定义了案例的 "View All" 权限。对对象的其他 SOQL 查询,例如:具有非常相似结构的 "User" 和 "UserRecordAccess" 工作正常,对于 REST APEX 和测试 APEX。

有没有办法为单元测试 (@isTest) 配置访问权限以读取 Case 对象和一些字段,例如:Id 和 CaseNumber。此错误是否与 "Tooling API" 功能有关,我们如何在测试过程中解决此问题?

代码附件:单元测试代码

@isTest
private class MyRestResource1Test {
     static testMethod void MyRestRequest() { 
     // generate temporary test user object and assign to running process
     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);
     System.RunAs(pu) {
          RestRequest req = new RestRequest();
          RestResponse res = new RestResponse(); 
          req.requestURI = '/services/apexrest/sfcheckap/';
          req.addParameter('useremail','testuserid@red.com');
          req.addParameter('casenumber','00001026'); 
          req.httpMethod = 'GET';
          RestContext.request = req;
          RestContext.response = res;
          System.debug('Current User assigned is: ' + UserInfo.getUserName());
          System.debug('Current Profile assigned is: ' + UserInfo.getProfileId()); 
          Test.startTest(); 
          Map<String, Boolean> resultMap = MyRestResource1.doGet(); 
          Test.stopTest();
          Boolean debugflag = resultMap.get('accessPermission');
          String debugflagstr = String.valueOf(debugflag);
          System.assert(debugflagstr.contains('true'));
        }   
    }  
}

通过使用找到解决方案路径:@isTest(SeeAllData=true)

查看文章:"Using the isTest(SeeAllData=true) Annotation"

https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_testing_seealldata_using.htm