微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SObject关系:字段不可写:Child__r

如何解决SObject关系:字段不可写:Child__r

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

我有一个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];

Parent__c和Child__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    
}

但是,如果执行此操作,则会收到错误消息

该字段不可写:Parent__c.Children__r

我知道我可以插入孩子和父母,然后使用关系查询。如前所述,我想避免执行DML并重新查询记录,因为这会不必要地降低速度,并且在其他测试中也会重复。

另外,我只想知道是否有解决此问题的方法...那么有没有办法像上面Apex中所述构建对象而不用查询获取数据?

解决方法

从技术上讲,您可以使用 JSON 解决方法创建具有相关子 SObject 的父 SObject。我从 a Cloud Giants' blog 获得实现,它使用往返 JSON 序列化手动添加子 SObject 所需的元数据。该博客更深入地探讨了 n-deep 关系,但要点是:

  1. 将父 sObject 序列化为 JSON:
    String parentJson = JSON.serialize(testParent);
    
  2. 为子 sObject 手动创建 JSON 元数据:
    String childrenJson = '"Children__r": {'
        + '"totalSize": ' + testChildren.size() + ','
        + '"done": true,'
        + '"records": ' + JSON.serialize(testChildren)
        + '}';
    
  3. 将孩子的 JSON 元数据合并到父母的 JSON 的末尾:
    parentJson = parentJson.substring(0,parentJson.length() - 1) + ','
        + childrenJson
        + '}';
    
  4. 将 JSON 元数据反序列化回 SObject:
    (Parent__c) JSON.deserialize(parentJson,Parent__c.class);
    

我最终在辅助方法中使用了“通用”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);
}

如果需要,您还可以查看上面提到的博客以获取更复杂的实用程序。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。