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

插入前/更新前Apex触发器上的测试覆盖率失败

许毅
2023-03-14

我有一个非常简单的机会插入/更新前触发器,它根据包含销售办事处(州)位置信息的下拉值自动选择价目表。

这是我的触发器:

trigger SelectPriceBook on Opportunity ( before insert, before update ) {

    for( Opportunity opp : Trigger.new ) {
        // Change Price Book
        // New York
        if( opp.Campus__c == 'NYC' )
          opp.Pricebook2Id = PB_NYC; // contains a Pricebook's ID

        // Atlanta
        if( opp.Campus__c == 'ATL' )
          opp.Pricebook2Id = PB_ATL; // contains another Pricebook's ID
    }
}

这是我的测试课:

@isTest (SeeAllData = true)
public class SelectPriceBookTestClass {

    static testMethod void validateSelectPriceBook() {

        // Pricebook IDs
        ID PB_NYC =  'xxxx';
        ID PB_ATL =  'xxxx';

        // New Opp
        Opportunity opp = new Opportunity();
        opp.Name = 'Test Opp';
        opp.Office__c = 'NYC';
        opp.StageName = 'Quote';       

        // Insert
        insert opp;

        // Retrive inserted opportunity
        opp = [SELECT Pricebook2id FROM Opportunity WHERE Id =:opp.Id];
        System.debug( 'Retrieved Pricebook Id: ' + opp.Pricebook2Id );

        // Change Campus
        opp.Office__c = 'ATL';
        // Update Opportunity
        update opp;

        // Retrive updated opportunity
        opp = [SELECT Pricebook2id FROM Opportunity WHERE Id =:opp.Id];
        System.debug( 'Retrieved Updated Pricebook Id: ' + opp.Pricebook2Id );        

        // Test
        System.assertEquals( PB_ATL, opp.Pricebook2Id );

    }
}

测试运行报告0%的测试覆盖率。

同样,在类似的行中,我有另一个before insert触发器,它将事件的所有者设置为与父潜在客户的所有者相同。代码如下:

trigger AutoCampusTourOwner on Event( before insert ) {

    for( Event evt : Trigger.new ) {
        // Abort if other kind of Event
        if( evt.Subject != 'Visit' )
            return;        

        // Set Owner Id
        Lead parentLead = [SELECT OwnerId FROM Lead WHERE Id = :evt.WhoId];
        evt.OwnerId = parentLead.OwnerId;

    }
}

这也导致了0%的覆盖率——我猜这与这两个循环中的for循环有关。我知道我在for循环中调用SOQL查询是在严重藐视DML规则,但出于我的目的,这应该是好的,因为这些事件是手动创建的,一次只能创建一个,所以没有由于批量插入而引入的调控器限制范围。

两种情况下的代码都可以100%工作。请为测试用例提出修复建议。

共有3个答案

艾正浩
2023-03-14

我有这些的测试课

inflooens__Client_Email__c触发ClientEmailTrigger(插入后、更新后、插入前、更新前){

ApexTriggerSettings__c setting = ApexTriggerSettings__c.getValues('Inflooens Trigger Settings');

if(setting != NULL && setting.ClientEmailTrigger__c == TRUE){

    AuditTrailController objAdt = new AuditTrailController();
    
    if(Trigger.isAfter){
        if(Trigger.isUpdate){
            System.debug('In Update Client Email Record');
            objAdt.insertAuditRecord(Trigger.newMap, 'inflooens__Client_Email__c', Trigger.new.get(0).Id, Trigger.oldMap);
        }
    
        if(Trigger.isInsert){
            objAdt.insertAuditRecord(Trigger.newMap, 'inflooens__Client_Email__c', null , null);
        }
    }
}

}

孔驰
2023-03-14

对于第一个触发器,不要做任何事情,只需创建机会并像这样执行即可。

SelectPriceBook的测试类

@isTest
    private class TriggerTestClass {

        static testmethod void selectPriceTest(){
            Opportunity opps = new Opportunity(
                Name= 'Test Opps',
                CloseDate = System.today().addDays(30),
                StageName = 'Prospecting', 
                ForecastCategoryName = 'Pipeline',
                Office__c = 'NYC');
                insert opps;

                Opportunity opps2 = new Opportunity(
                Name= 'Test Opps 2',
                CloseDate = System.today().addDays(28),
                StageName = 'Prospecting', 
                ForecastCategoryName = 'Pipeline',
                Office__c = 'ATL');
                insert opps2;
        }

    }

它会给你很好的测试覆盖率,我不知道你在AutoCampusTourOwner中想做什么!

高建本
2023-03-14

你试过扳机吗。古老的我的想法是,当您将测试类中的office从NYC更新为ATL时,“NYC”值将在触发器中。旧的,这就是你想要检查你的触发器。我可能是错的,因为我也是apex的新手,但试试看,让我知道会发生什么。

 类似资料:
  • 11.3. 测试覆盖率 就其性质而言,测试不可能是完整的。计算机科学家Edsger Dijkstra曾说过:“测试能证明缺陷存在,而无法证明没有缺陷。”再多的测试也不能证明一个程序没有BUG。在最好的情况下,测试可以增强我们的信心:代码在很多重要场景下是可以正常工作的。 对待测程序执行的测试的程度称为测试的覆盖率。测试覆盖率并不能量化——即使最简单的程序的动态也是难以精确测量的——但是有启发式方法

  • 在“name=new.user_name”后面发现意外的标记“end-of-statement”。预期的令牌可能包括:“”..sqlcode=-104,sqlstate=42601,driver=4.9.78 SQL code:-104,SQL state:42601

  • tl;dr-在继续测试之前,如何使测试类等待特定触发器完成其更新或插入? 出身背景 我有一个触发器,每当创建帐户对象时都会创建一个新的对象,然后将这两条记录相互关联(请参阅下面的帐户触发器)。 我还在Portal\u Content\u c对象上创建了一个触发器,在删除记录时触发该触发器。删除时,触发器会查找相关的帐户记录并将其删除(请参见下面的门户内容触发器)。 我的问题是关于我的门户内容测试类

  • 我对Apex很陌生。。一天过去了,我为我的失礼感到非常抱歉。我要做的是返回我的帐户列表,然后查看帐户的合同日期(contract\u Expiration\uu c)。根据该日期,应将自定义字段(update\u active\u status\u text\uu c)更新为null、active或Void。 我没有得到任何错误,但我没有得到任何代码覆盖率。任何帮助都将大有裨益。 提前感谢 顶点类

  • 也许有人能帮我澄清一下。 我正在尝试编写一个插入前触发器,如果它留空,可以设置关闭。这可能吗? 没有太多代码可显示。我所做的只是创建了一个带有调试语句的简单的插入前触发器,以确保我的触发器在验证规则之前执行。似乎验证规则是第一位的(我显然无法更改它)。触发器永远不会触发。 这是可行的还是不可能的?

  • 我面临以下问题, [错误]无法在项目 Vsts 上执行目标组织 apache.maven.plugins:maven-antrun-plugin:1.8:run(默认):发生蚂蚁构建异常:创建报告时出错 [ERROR]关于Ant部件……@8:11 in/__w/49/s/target/antrun/build main。xml:分析myapp/target时出错/demo.war@WEB-INF/