2013-10-10 34 views
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循環中調用SOQL查詢嚴重地蔑視DML規則,但對於我的目的而言,它應該沒問題,因爲這些事件是手動創建的,並且一次只能創建一個 - 因此,沒有限制範圍的限制批量插入。

這兩種情況下的代碼工作都是100%。請爲測試案例提出修復建議。

+0

在第一種情況下,您的觸發器正在看campus__c,但您的測試正在設置office__c – superfell

+0

@superfell對不起 - 這裏是一個錯字。但是代碼仍然失敗。有什麼建議麼? –

回答

0

你試過了嗎?我的想法是,當你將你的測試課上的辦公室從NYC更新到ATL時,'NYC'值將觸發。這就是你想要檢查你的觸發器。 我可能是錯的,因爲我也是新手,但嘗試一下,讓我知道會發生什麼。

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做!