适用于APEX触发器的Salesforce测试类

时间:2013-07-08 09:01:02

标签: testing triggers salesforce case apex-code

我需要一些关于编写测试脚本的帮助,该脚本涵盖了我已经设法在我的Sandbox帐户上工作的足够下面的触发器。 触发器是在关闭某些类型的机会时创建额外资产。触发器似乎运行良好但我真的不知道如何开始编写测试用例...为了关闭这些机会,帐户需要完成以下内容(我已经包含了一些示例数据 - 它们是选项列表所以需要具体数量):

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 = 'testemail4trigger@test.co.uk';
          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;
  }        
}

如果有人能说我是否朝着正确的方向前进,我将不胜感激。试图解决这些错误,但如果这无论如何都没有用,那显然没有意义。 感谢

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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/

主要的麻烦是在for循环中使用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.
      }
 }

希望这可能对你有所帮助