2013-07-08 234 views
1

我需要一些關於編寫測試腳本的幫助,該腳本涵蓋了足夠的以下觸發器,我已經設法在我的沙盒帳戶上工作。 觸發器是在特定類型的商機關閉時創建額外資產。觸發似乎運行良好,但我真的不知道如何開始編寫測試用例...爲了這些機會關閉,帳戶需要完成以下(我已經包含一些示例數據 - 它們是選擇列表必須特異性金額):APEX觸發器的Salesforce測試類

a.TurnoverBand__c = '<£10 million'; 
a.Joining_Fee__c = '£1,920'; 
a.Annual_Subscription__c = '£1,320'; 

觸發如下:

trigger CreateInclusiveAssetonMembershipWon on Opportunity (after insert, after update) 
{ 
    for(Opportunity o: trigger.new) 
    { 
    if(o.isWon == true && o.HasOpportunityLineItem == true && (o.Type == 'A Membership' || o.Type == 'AB Membership' || o.Type == 'A Membership Upgrade' || o.Type == 'AB Membership Upgrade')) 
    { 
    String opptyId = o.Id; 
    Asset[] ast = new Asset[]{}; 
    Asset a = new Asset(); 
     { 
     a = new Asset(); 
     a.AccountId = o.AccountId; 
     a.Product2Id = '01tA0000003N1pW'; 
     a.Quantity = o.Inclusive_Training_Spaces_Allocated__c; 
     a.Price = 300; 
     a.PurchaseDate = o.CloseDate; 
     a.Status = 'Purchased'; 
     a.Description = 'Allocated Spaces'; 
     a.Name = 'Membership Inclusive Training'; 
     ast.add(a); 
     } 
    insert ast; 
    } 
    } 
} 

如果有人可以幫助我在此我將不勝感激!

感謝

這個觸發到目前爲止ETA測試腳本:

@isTest 
private class TrngAstOppTrigTestSuite { 

     static testMethod void verifyBehaviorOnInsert_positive() { 
      Account a = new Account(); 
     a.Name = 'New Test Account'; 
     a.Account_Email__c = '[email protected]'; 
      a.TurnoverBand__c = '<£10 million'; 
      a.Joining_Fee__c = '£1,920'; 
     a.Annual_Subscription__c = '£1,320'; 
     insert a; 

      Opportunity o = new Opportunity(); 
      OpportunityLineItem ol = new OpportunityLineItem(); 
      PricebookEntry pbID = [select ID from PricebookEntry]; 

     o.AccountId = a.Id; 
     o.Name = 'test'; 
      o.Type = 'A Membership'; 
      o.StageName = 'Needs Analysis'; 
      o.CloseDate = date.today(); 
      insert o; 

     ol.OpportunityId = o.Id; 
     ol.Quantity = 1; 
     ol.UnitPrice = 2.00; 
      ol.PricebookEntryId = pbID.Id; 

      insert ol; 

     o.StageName= 'Closed Won'; 
      update o; 

      delete ol; 
      delete o; 
    }   
} 

如果任何人都可以說,如果我在正確的方向這是怎麼回事我將不勝感激。試圖消除這些錯誤,但是如果這不起作用,顯然沒有意義。 感謝

回答

0

Here is a link to the Apex code documentation that shows how to create a test.

所有你需要做的是寫一個插入或更新的機會,同時滿足您定義的標準,在觸發一個TestMethod的。一個好的單元測試應該測試各種場景並驗證代碼產生預期的輸出(在這種情況下,查詢新的資產)。

另外,我應該指出你的代碼在它的設計中有一個嚴重的缺陷。 在循環內部幾乎不應該有DML語句(或任何數據庫語句)。我已經爲您提供了固定版本的代碼,但我強烈建議您前往developer.force.com並遵循一些入門材料以避免未來的麻煩。

trigger CreateInclusiveAssetonMembershipWon on Opportunity (after insert, after update) 
{ 
    Asset[] assets = new Asset[0]; 
    for(Opportunity o: trigger.new) 
    { 
     if(o.isWon == true && o.HasOpportunityLineItem == true && (o.Type == 'A Membership' || o.Type == 'AB Membership' || o.Type == 'A Membership Upgrade' || o.Type == 'AB Membership Upgrade')) 
     { 

      Asset a = new Asset(); 
      a.AccountId = o.AccountId; 
      a.Product2Id = '01tA0000003N1pW'; 
      a.Quantity = o.Inclusive_Training_Spaces_Allocated__c; 
      a.Price = 300; 
      a.PurchaseDate = o.CloseDate; 
      a.Status = 'Purchased'; 
      a.Description = 'Allocated Spaces'; 
      a.Name = 'Membership Inclusive Training'; 
      assets.add(a); 
     } 
    } 
    insert assets; 
} 
+0

感謝您的快速反應!我現在已經改變了我的觸發器代碼,並且確保從現在開始不會在循環中包含任何DML ...關於測試,我有以下幾點 - 任何人都可以說如果我要朝着正確的方向前進?我發現DeveloperForce頁面上的例子有點令人困惑。非常感謝。 –

+0

在對您的測試示例進行快速瀏覽之後,我可以說您絕對需要瀏覽developer.force.com提供的教程和指南。 例如;你的測試代碼沒有assert語句,沒有他們你確認你的代碼沒有未捕獲的異常,但是你沒有確認它是否按預期工作。在測試結束時您還會有不必要的DML刪除語句,對測試代碼中對象的更改不會提交給數據庫。 –

0

首先 - 您的觸發器在執行時遇到了麻煩,因爲它不是BULK。 閱讀以下文章瞭解詳情: http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_bestpract.htm http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_triggers_bulk_idioms.htm http://blog.jeffdouglas.com/2009/04/20/writing-bulk-triggers-for-salesforce/

主要的麻煩是在使用DML操作循環。

關於這個代碼,我認爲最好的方法是使用下面的方案的測試過程:

你應該來測試你的代碼的所有可能的行爲,負場景應該覆蓋以及積極的。因此

@isTest 
private class OpportunityTriggerTestSuite { 

     static testMethod void verifyBehaviorOnInsert_positive() { 
      // prepare correct opportunity and insert it 
      // perform checking for opportunity and assets states 
      // use System.assertEquals() or System.assert() methods 
      // http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_methods_system_system.htm 

     } 

     static testMethod void verifyBehaviorOnUpdate_positive() { 
      // prepare correct opportunity and insert it 
      // change a few fields on opportunity and update it 
      // perform assertion for opportunity and assets 
     } 

     static testMethod void verifyBehaviorOnInsert_negative() { 
      // prepare incorrect opportunity and insert it 
      // perform assertion for opportunity and assets expected states/error/etc. 
     } 

     static testMethod void verifyBehaviorOnInsert_negative() { 
      // prepare correct opportunity and insert it 
      // check state 
      // change a few fields in such manner that opportunity will be incorrect and update it 
      // perform assertion for opportunity and assets expected states/error/etc. 
     } 
} 

希望這也許對你有所幫助

+0

感謝您的快速響應!我現在已經改變了我的觸發器代碼,並且確保不會在現在的循環中包含任何DML ...關於測試腳本,我已經添加了我的原始問題 - 任何人都可以說我是走向正確的方向?我發現DeveloperForce頁面上的例子有點令人困惑。非常感謝。 –

相關問題