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% のテスト カバレッジが報告されます。

また、同様の行で、イベントの所有者を親リードの所有者と同じに設定する別の 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 ルールを真剣に無視していることはわかっていますが、これらのイベントは手動で作成され、一度に 1 つしか作成されないため、私の目的では問題ないはずです。一括挿入します。

どちらの場合も、コードは 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 に答える