2012-06-12 114 views
0

我寫了一個獨特的資產名稱的觸發器。我必須爲它寫一個測試用例,有人可以幫助我是apex的新手。上資產在apex salesforce中爲觸發器寫一個測試用例

觸發NameTrigger(前插入)

{

列表AL =新列表();

al = [從資產中選擇姓名];

如果(Trigger.isInsert)

{

For(integer i=0;i<al.size();i++) 

{ 

    for(Asset a2 : Trigger.New) 

    { 

     if(al[i].Name == a2.Name) 

     { 

      a2.Name.addError('This value already Exist'); 

     } 

    } 

} 

}

}

回答

1

測試類爲您的觸發會是這個樣子。

@isTest 
private class AssetTriggerTest { 

    private static string assetName = 'TestAsset'; 
    private static Id accId; 

    private static void createAccount(){ 
     Account acc = new Account(name='TestAcc'); 
     insert acc; 
     accId = acc.Id; 
    } 

    private static Asset createAsset(){ 
    if(accId == null) 
      createAccount(); 
     return new Asset(Name=assetName, AccountId=accId); 
    } 

    private static testMethod void testSingleInsert(){ 
     insert createAsset(); 

     List<Asset> assets = [SELECT Id FROM Asset WHERE Name = :assetName]; 
     system.assertEquals(1, assets.size()); 
    } 

    private static testMethod void testInsertExistingName(){ 
     insert createAsset(); 

     Exception e; 
     try{ 
      insert createAsset(); 
     } catch(Exception ex){ 
      e = ex; 
     } 

     system.assertNotEquals(null, e); 
     system.assert(e instanceOf system.Dmlexception); 
     system.assert(e.getMessage().contains('FIELD_CUSTOM_VALIDATION_EXCEPTION')); 
     system.assert(e.getMessage().contains('This name is already used')); 
    } 

    private static testMethod void testDoubleInsertSameName(){ 

     Exception e; 
     try{ 
      insert new List<Asset>{createAsset(), createAsset()}; 
     } catch(Exception ex){ 
      e = ex; 
     } 

     system.assertNotEquals(null, e); 
     system.assert(e instanceOf system.Dmlexception); 
     system.assert(e.getMessage().contains('FIELD_CUSTOM_VALIDATION_EXCEPTION')); 
     system.assert(e.getMessage().contains('This name is already used')); 

    } 

} 

類測試觸發器不會停止保存有效數據,並確保它停止創建重複項。我還添加了第三個測試,以確保數據不會在Trigger.new集合內重複保存。你的觸發器目前不能滿足這個要求,所以我包含了一個我如何正確使用這個觸發器來通過所有三個測試的副本;隨時忽略。

trigger AssetTrigger on Asset (before insert) { 

    Map<string, Asset> newAssets = new Map<string, Asset>(); 
    for(Asset a : Trigger.new){ 
     if(!newAssets.containsKey(a.Name)) 
      newAssets.put(a.Name, a); 
     else 
      a.Name.addError('This name is already used'); 
    } 

    for(Asset a : [SELECT Name FROM Asset WHERE Name IN :newAssets.keySet()]){ 
     newAssets.get(a.Name).Name.addError('This name is already used'); 
    } 

} 
相關問題