営業所 (州) の場所情報を含むドロップダウン値に基づいて価格表を自動選択する商談の挿入/更新トリガーの前に、この非常に単純なものがあります。
これが私のトリガーです:
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% 機能します。テストケースの修正を提案してください。