在商機上插入/更新觸發器之前,我可以非常簡單地根據包含銷售辦公室(州)位置信息的下拉值自動選擇價格手冊。測試覆蓋率在插入前/更新前失敗頂點觸發器
這裏是我的觸發:
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%。請爲測試案例提出修復建議。
在第一種情況下,您的觸發器正在看campus__c,但您的測試正在設置office__c – superfell
@superfell對不起 - 這裏是一個錯字。但是代碼仍然失敗。有什麼建議麼? –