Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Salesforce SObject关系:字段不可写:子项_Salesforce_Apex_Force.com - Fatal编程技术网

Salesforce SObject关系:字段不可写:子项

Salesforce SObject关系:字段不可写:子项,salesforce,apex,force.com,Salesforce,Apex,Force.com,我正在为我的代码编写一个测试类,遇到了一个让我恼火的问题。所以我想知道是否有任何方法可以做到这一点 我有一个Apex类,其中包含一些功能,我正在进行单元测试,假设它的定义如下: public class HelperClass { public static Object someFunction(Parent__c parentObject) {} } parentObject SObject输入应以这样的方式提供,即它将包含父记录和子记录,以便它们作为一个输入传递并保持在一起。这是

我正在为我的代码编写一个测试类,遇到了一个让我恼火的问题。所以我想知道是否有任何方法可以做到这一点

我有一个Apex类,其中包含一些功能,我正在进行单元测试,假设它的定义如下:

public class HelperClass {
    public static Object someFunction(Parent__c parentObject) {}
}
parentObject SObject输入应以这样的方式提供,即它将包含父记录和子记录,以便它们作为一个输入传递并保持在一起。这是由调用方法通过使用类似于以下方式的关系查询来完成的:

Parent__c parentObject = [SELECT Id, Name, (SELECT Id, Name FROM Children__r) WHERE Id = :recId];
父对象c和子对象c都是配置对象,所以对于测试,我非常清楚它们通常应该是什么样子,以适合我的测试用例。我想看看是否可以跳过DML,因为我想要快速测试类,并且我想为所有断言创建很多记录。所以我想构建如下的测试数据:

@IsTest
private static void testHelperClassSomeFunction() {    
    // define children records
    List<Child__c> testChildren = new List<Child__c>{new Child__c(Name = 'Test Child Record')};    
    
    // define parent record
    Parent__c testParent = new Parent__c(Name = 'Test Parent Record');
    // add children records to the relationship:
    testParent.Children__r = testChildren;

    Object testOutput = HelperClass.somefunction(testParent);    
    // asserts here    
}
@IsTest
私有静态void testHelperClassSomeFunction(){
//定义子记录
List testChildren=newlist{new Child_u__c(Name='Test Child Record');
//定义父记录
父项测试父项=新父项测试父项(名称='测试父项记录');
//将子记录添加到关系:
testParent.Children\uuu r=testChildren;
对象testOutput=HelperClass.somefunction(testParent);
//在这里断言
}
但是,如果我这样做,我会得到错误

字段不可写:父项\u c.子项\u\r

我知道我可以插入子对象和父对象,然后使用关系查询。如前所述,我希望避免进行DML和重新查询记录,否则这将是不必要的缓慢,并且这将在其他测试中重复


另外,我只是想知道有没有办法解决这个问题。。。那么,有没有办法在Apex中构建如上所述的对象,而不必使用查询获取数据?

从技术上讲,您可以使用JSON解决方案创建父对象和相关子对象。我从中获得了一个实现,它使用往返JSON序列化为子Sobject手动添加所需的元数据。该博客深入探讨了n-deep关系,但要点如下:

  • 将父sObject序列化为JSON:
    String parentJson = JSON.serialize(testParent);
    
  • 手动为子Sobject创建JSON元数据:
    String childrenJson = '"Children__r": {'
        + '"totalSize": ' + testChildren.size() + ', '
        + '"done": true,'
        + '"records": ' + JSON.serialize(testChildren)
        + '}';
    
  • 将子级JSON元数据合并到父级JSON的末尾:
    parentJson = parentJson.substring(0, parentJson.length() - 1) + ','
        + childrenJson
        + '}';
    
  • 将JSON元数据反序列化回SObject:
    (Parent__c) JSON.deserialize(parentJson, Parent__c.class);
    
  • 最后,我在助手方法中使用了“generic”
    SObject
    ,允许我在多个测试中使用它

    private static SObject hydrateChildRecordList(String relationshipName, SObject parent, List<SObject> children) {
        String recordJson = JSON.serialize(parent);
        String childrenJson = '"' + relationshipName + '": {'
            + '"totalSize": ' + children.size() + ', '
            + '"done": true,'
            + '"records": ' + JSON.serialize(children)
            + '}';
        recordJson = recordJson.substring(0, recordJson.length() - 1) + ',' + childrenJson + '}';
    
        return (SObject) JSON.deserialize(recordJson, SObject.class);
    }
    
    私有静态SObject HildRecordList(字符串关系名称、SObject父项、列表子项){
    String recordJson=JSON.serialize(父级);
    字符串childrenJson=''''+relationshipName+'':{'
    +““totalSize”:“+子级.size()+”,”
    +“完成”:正确
    +““记录”:“+JSON.serialize(子项)
    + '}';
    recordJson=recordJson.substring(0,recordJson.length()-1)+','+childrenJson+'}';
    返回(SObject)JSON.deserialize(recordJson,SObject.class);
    }
    
    如果你需要的话,你也可以在上面提到的博客上找到更复杂的工具