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"
我已经成功地使用通过注释定义的 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"