0

在机会上插入/更新触发器之前,我有这个非常简单,它根据包含销售办公室(州)位置信息的下拉值自动选择价格手册。

这是我的触发器

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% 测试覆盖率

此外,在类似的行上,我还有另一个插入前触发器,它将事件的所有者设置为与父潜在客户的所有者相同。这是代码:

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% 工作。请为测试用例提出修复建议。

4

3 回答 3

0

你试过 trigger.old 吗?我的想法是,当您将测试类中的办公室从 NYC 更新到 ATL 时,值“NYC”将在 trigger.old 中,这就是您要在触发器中检查的内容。我可能是错的,因为我也是 apex 的新手,但试试吧,让我知道会发生什么。

于 2013-11-15T14:53:53.373 回答
0

对于第一个触发器,不要做任何事情,而只是创造机会并像这样执行。

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 中做什么!

于 2014-03-13T23:28:54.800 回答
0

我有这些的测试课

在 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);
        }
    }
}

}

于 2021-04-29T06:03:27.980 回答