Salesforce.com Apex测试类问题:需要硬编码Opportunity自定义字段值

Salesforce.com Apex测试类问题:需要硬编码Opportunity自定义字段值,salesforce,Salesforce,我有一个VF页面表单,它有一个文本字段。此文本字段的值与现有opportunity自定义字段进行比较。如果opportunity中存在此文本字段的值,我将继续创建新记录 除了创建一个Apex测试类外,其他一切都很顺利 我需要创建一个opportunity并对自定义字段的值进行硬编码。不幸的是,此字段不可写 以前有人遇到过这个问题吗 这是我得到的错误: 错误:编译错误:字段不可写:Opportunity.Deal\u Registration\u ID\u\c在第9行第103列 下面是我的课程 我

我有一个VF页面表单,它有一个文本字段。此文本字段的值与现有opportunity自定义字段进行比较。如果opportunity中存在此文本字段的值,我将继续创建新记录

除了创建一个Apex测试类外,其他一切都很顺利

我需要创建一个opportunity并对自定义字段的值进行硬编码。不幸的是,此字段不可写

以前有人遇到过这个问题吗

这是我得到的错误: 错误:编译错误:字段不可写:Opportunity.Deal\u Registration\u ID\u\c在第9行第103列

下面是我的课程

我的测试班在最底层

非常感谢您的帮助

干杯! 隆美尔


什么是
Opportunity.Deal\u Registration\u ID\u c
字段类型?如果它是一个公式字段或自动编号,它将真的无法从Apex写入

一般来说,在这种情况下,您必须插入Opportunity(没有此字段集),然后在成功插入后从数据库中读取它。如果它是自动编号-魔术将自行发生(尽管我不会说让某些类型的许可证编号连续并容易伪造是最好的主意),如果它是公式字段-确保在插入之前设置了计算中使用的所有字段

所以,像这样的事情应该可以做到:

Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Probability = 95, CloseDate=system.today());
insert opp;
opp = [SELECT Id, Name, Deal_Registration_ID__c FROM Opportunity WHERE Id = :opp.Id];

// Optionally - make sure value was set
System.assertNotEquals(null, opp.Deal_Registration_ID__c);
System.assert(opp.Deal_Registration_ID__c.length() > 0); // if it's a String

Vault__c vault = new Vault__c(
    Deal_Registration__c = opp.Deal_Registration_ID__c ,
    Scenario__c = 'BIG-IP front ending Firewalls',
    isValidDealReg__c = true,
    Status__c = 'Application Received',
    Load_Balancer_is_a_Firewall__c = 'Yes',
    Providing_DDos_Connection__c = 'Firewalls',
    Providing_DDos_protection_except_ASM__c = 'Yes',
    No_Traffic_Traverse__c = 'Yes',
    Firewall_Vendor_Name__c = 'Firewall Vendor Company',
    First_Name__c = 'Test First Name',
    Last_Name__c = 'Test Last Name',
    Company_Name__c = 'Test Company Name',
    Phone__c = '(206) 946-3126',
    Email__c = 'test@email.com',
    Country__c = 'United States',
    Additional_Info__c = 'Test Additional Info',
    Related_Opp__c = opp.Id
);

你有我的+1表示“哦”;)但您是否也可以发布您的测试类&eclipse错误(我知道这是一个编译错误,它会抱怨特定字段)?公式、自动编号等确实不可写-您需要先插入记录,然后以某种方式将其传递到VF页面?或者,如果是关于验证码的,请查看Test.isRunningTest(),并使用它硬编码一个伪值,而不是随机值?谢谢!我想我们越来越近了。不幸的是,我得到了以下错误。消息:System.DmlException:插入失败。第0行的第一个异常;第一个错误:字符串太长,交易注册:数据值太大:未正式注册(最大长度=20):[Deal\u Registration\uuu c]堆栈跟踪:Class.VaultVFTEST.VaultVFTEST:第41行第1列有时间时,请提供帮助。谢谢,RommelWell,这是您自己的自定义字段:D联系创建它的管理员(设置->创建->对象->交易注册->字段,共同决定是否可以编辑此字段以使其更长(我猜最大值为255个字符),或者您必须调用
opp.Deal\u Registration\u ID\u c.left(20)
在您的测试中。理想情况下,两个字段的大小应该相同,请同时检查设置->创建->机会->字段。(截断这些数字听起来不是一个有效的想法;)
@isTest
public class VaultVFTEST {

/*This tests the VaultVF class on the Vault__c object*/

static testMethod void VaultVFTEST() {

    //Create opp, hardcode the Deal_Registration_Id__c field with 'x111111111' and insert opp
    Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Deal_Registration_Id__c='x111111111', Probability = 95, CloseDate=system.today());
    insert opp;

    //Create and insert Vault record
    Vault__c vault = new Vault__c(
        Deal_Registration__c = 'x111111111',
        Scenario__c = 'BIG-IP front ending Firewalls',
        isValidDealReg__c = true,
        Status__c = 'Application Received',
        Load_Balancer_is_a_Firewall__c = 'Yes',
        Providing_DDos_Connection__c = 'Firewalls',
        Providing_DDos_protection_except_ASM__c = 'Yes',
        No_Traffic_Traverse__c = 'Yes',
        Firewall_Vendor_Name__c = 'Firewall Vendor Company',
        First_Name__c = 'Test First Name',
        Last_Name__c = 'Test Last Name',
        Company_Name__c = 'Test Company Name',
        Phone__c = '(206) 946-3126',
        Email__c = 'test@email.com',
        Country__c = 'United States',
        Additional_Info__c = 'Test Additional Info',
        Related_Opp__c = opp.Id
    );

    //Now insert the vault record to invoke the VaultVF class
    Test.startTest();
    insert vault;
    Test.stopTest();

    //Assertion Testing - Check to make sure the Deal_Registration__c value
    //matches the Deal_Registration_Id__c value of the related opportunity
    for(Vault__c v : [select Id, Deal_Registration__c from Vault__c where Deal_Registration__c IN :vault]){
        system.assertEquals(v.Deal_Registration__c, opp.Deal_Registration_Id__c);
    }
}
}
Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Probability = 95, CloseDate=system.today());
insert opp;
opp = [SELECT Id, Name, Deal_Registration_ID__c FROM Opportunity WHERE Id = :opp.Id];

// Optionally - make sure value was set
System.assertNotEquals(null, opp.Deal_Registration_ID__c);
System.assert(opp.Deal_Registration_ID__c.length() > 0); // if it's a String

Vault__c vault = new Vault__c(
    Deal_Registration__c = opp.Deal_Registration_ID__c ,
    Scenario__c = 'BIG-IP front ending Firewalls',
    isValidDealReg__c = true,
    Status__c = 'Application Received',
    Load_Balancer_is_a_Firewall__c = 'Yes',
    Providing_DDos_Connection__c = 'Firewalls',
    Providing_DDos_protection_except_ASM__c = 'Yes',
    No_Traffic_Traverse__c = 'Yes',
    Firewall_Vendor_Name__c = 'Firewall Vendor Company',
    First_Name__c = 'Test First Name',
    Last_Name__c = 'Test Last Name',
    Company_Name__c = 'Test Company Name',
    Phone__c = '(206) 946-3126',
    Email__c = 'test@email.com',
    Country__c = 'United States',
    Additional_Info__c = 'Test Additional Info',
    Related_Opp__c = opp.Id
);