2013-07-08 3 views
1

Мне нужна помощь в написании тестового скрипта, который охватывает достаточно триггера, который мне удалось получить в моей учетной записи Sandbox. Триггер - это создание дополнительных активов при закрытии определенных типов возможностей. Кажется, что Trigger работает нормально, но я действительно не знаю, как начать писать тестовые примеры ... Для того, чтобы эти возможности были закрыты, Учетная запись должна иметь следующие завершенные (я включил некоторые примеры данных - они являются выборками, поэтому должны быть specif суммы):Класс тестирования Salesforce для триггера APEX

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

Trigger следующим образом:

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, который вставляет или обновляет возможность во время встречи критерии, которые определяют в вашем триггере. Хороший единичный тест должен проверять различные возможности и проверять, что код дает ожидаемые результаты (в этом случае запрашивайте новый Asset).

Кроме того, я должен указать, что ваш код имеет серьезный недостаток в его дизайне. Внутри цикла почти никогда не должно быть операторов 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

Если вы быстро взглянете на свой тестовый пример, я могу сказать, что вам обязательно нужно пройти через учебные пособия и руководства, предоставленные разработчиком.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 несколько запутанным. Большое спасибо. –

Смежные вопросы