【问题标题】:Writing a test case in apex salesforce for the trigger在 apex salesforce 中为触发器编写测试用例
【发布时间】:2012-06-12 05:31:53
【问题描述】:

我已经为唯一资产名称编写了触发器。我必须为此编写一个测试用例,有人可以帮助我是 apex 的新手。

在资产上触发 NameTrigger(插入前)

{

list al = new List();

al = [从资产中选择名称];

如果(触发器.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');

         }

     }

 }

}

}

【问题讨论】:

    标签: apex-code


    【解决方案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');
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2019-06-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      相关资源
      最近更新 更多