当前位置: 首页 > 知识库问答 >
问题:

Salesforce触发器测试类

常英资
2023-03-14

下面是我的顶点触发器。我是一名初学者,正在尝试编写其测试类,但不断出现错误“System.DmlException:Insert失败。第0行出现第一个异常;第一个错误:REQUIRED\u FIELD\u MISSING,错误:只有在产品相关列表上为此opportunity选择了价格手册,才能选择产品。:[]”。

在Opportunity上触发TrgrOptyHighestCustmorePrice(插入前、更新前){

public Id oid;
public String bidType;
public String BUCode;

for(Opportunity o : trigger.new)
{
    oid = o.Id; 
    bidType = o.BidType__c;
    BUCode = o.Business_Line_BU__c;
}

List<OpportunityLineItem> oliList = new list<OpportunityLineItem>([SELECT id, Customer_Price__c, ReCat_Product_Line__c 
                                                               FROM OpportunityLineItem 
                                                               WHERE OpportunityId =: oid ORDER BY 
                                                               Customer_Price__c DESC LIMIT 1]);

for(OpportunityLineItem oli : oliList)
{
    if(bidType == 'Competitive' && oli.ReCat_Product_Line__c == 'DMS')
    {
        BUCode = 'BL.619';
    }
    if(bidType == 'Competitive' && (oli.ReCat_Product_Line__c == 'EMS' || oli.ReCat_Product_Line__c == 'GMS'))
    {
        BUCode = 'BL.620';
    }
    if(bidType == 'Competitive' && oli.ReCat_Product_Line__c == 'MMS')
    {
        BUCode = 'BL.622';
    }
    if(bidType == 'Sole Sourced' && oli.ReCat_Product_Line__c == 'DMS')
    {
        BUCode = 'BL.624';
    }
    if(bidType == 'Sole Sourced' && (oli.ReCat_Product_Line__c == 'EMS' || oli.ReCat_Product_Line__c == 'GMS'))
    {
        BUCode = 'BL.621';
    }
    if(bidType == 'Sole Sourced' && oli.ReCat_Product_Line__c == 'MMS')
    { 
        BUCode = 'BL.623';
    }        
}

for(Opportunity opt : trigger.new)
{
    opt.Business_Line_BU__c = BUCode;        
}    
}

测试类别

@isTest(seeAllData=true)
public class Test_TrgrOptyHighestCustmorePrice {
    private static testmethod void TrgrOptyHighestCustmorePriceTest(){
        Test.startTest();
        //Insert a test product.
        Product2 p1 = new Product2(Name='Product Monthly 1111', isActive=true, CurrencyIsoCode='USD', ReCat_Product_Line__c = 'DMS');
        insert p1; 

        // Get standard price book ID.
        Id pricebookId = Test.getStandardPricebookId();

        // Insert a price book entry for the standard price book.
        PricebookEntry standardPrice = new PricebookEntry(
            Pricebook2Id = pricebookId, Product2Id = p1.Id,
            UnitPrice = 10000, IsActive = true);
        insert standardPrice;

        Pricebook2 customPB = new Pricebook2(Name='Custom Pricebook', isActive=true);
        insert customPB;

        PricebookEntry customPrice = new PricebookEntry(
            Pricebook2Id = customPB.Id, Product2Id = p1.Id,
            UnitPrice = 12000, IsActive = true);
        insert customPrice;

        // Insert Opportunity
        Opportunity opt = new Opportunity(Name='Test',StageName='Prospect', 
                                          CloseDate=date.today(),BidType__c = 'Competitive', 
                                          Business_Line_BU__c = 'BL.619', 
                                          PriceBook2 = customPB);
        insert opt;

        OpportunityLineItem optLI = new OpportunityLineItem(OpportunityId = opt.id, Product2Id = p1.Id);
        insert optLI;
        update opt;
        Test.stopTest();
    }

}

我无法理解如何测试我的简单触发器。

共有2个答案

范承望
2023-03-14

首先插入opportunity。然后使用pricebookid更新opportunity。

     // Insert Opportunity
    Opportunity opt = new Opportunity(Name='Test',StageName='Prospect', 
                                      CloseDate=date.today(),BidType__c = 'Competitive', 
                                      Business_Line_BU__c = 'BL.619'
                                      );
    insert opt;
opt.PriceBook2 = customPB;
update opt;
颛孙飞鸾
2023-03-14

因为u没有填写Opportunity行项目的所有必填字段。请参见:https://developer.salesforce.com/docs/atlas.en-us.api.meta/api/sforce_api_objects_opportunitylineitem.htm对于必填字段。

这是一个示例:

OpportunityLineItem optLI = new OpportunityLineItem(OpportunityId = opt.id, Product2Id = p1.Id, TotalPrice = 100, PricebookEntryId=customPrice.Id, Quantity =3);
 类似资料:
  • 你好 我正在Salesforce内部为trigger进行单元测试,我不断遇到一个似乎无法解决的错误,所以我希望有更多经验的人能帮助我回到正轨。我已经在Google上搜索过很多次了,我的代码结构也被弄乱了,但我找不到解决方案。 目的: 我的任务是编写一个触发器,该触发器将处理维护每个开发人员的案例排名所需的逻辑。每个开发人员都被分配了案例,这些案例可能有也可能没有由业务确定的优先级。每个开发人员在任

  • 大家好, 我正在尝试为我帮助编写的触发器编写一个测试类。触发器使用名为trigger\u help\u c的字段,该字段是通过添加opportunity Type和Account ID派生的公式字段,如果在过去90天内已在该帐户上创建了该类型的opportunity,则在插入之前激发。除非配置文件是系统管理员。这是我的触发器: 我在写测试课时遇到了困难,我像往常一样不知所措。我写了以下内容,但我不

  • 我已在Salesforce APEX中记录了触发器。它工作正常。 触发器代码为: 现在我正在尝试为它的测试类编写代码。它在线上给出错误,说对象无法解析为字符串。 测试等级代码为: 期待找到解决方案。任何帮助都将不胜感激。 谢谢

  • 我已经为此发疯了。我的IF循环中没有任何东西通过我的测试类触发,我不知道为什么。我在网上阅读了很多,看起来我做的事情是正确的,但它仍然没有解决我的代码覆盖率。这是运行的最后一行:如果(isIn==True){ 之后我无法让任何东西在IF循环中运行,我已经颠倒了逻辑,它仍然无法运行。我觉得当有人指出它时,我会踢自己,但这是我的代码: } 这是我的测试类:

  • 我在Apex中有一个触发器。如何编写检查触发器是否被调用的单元测试?

  • 我正在尝试使用Apex触发器而不是process builder来集成Slack。我找到了一种使用触发器来执行它的方法,它完全符合我的要求。然而,我无法获得适当的测试覆盖率,并且该方法也通过了,没有错误。 我对这种类型的集成相当陌生。我确信我错过了一些我无法弄清楚的东西。 我也有其他方法,我正在从Apex类调用这些方法,但我想如果我能涵盖一个方法,我将能够与其他方法一起工作。见下文: Apex触发