1

我需要一些关于编写测试脚本的帮助,该脚本涵盖了我设法在我的 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;
  }        
}

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

4

2 回答 2

0

这是 Apex 代码文档的链接,该文档显示了如何创建测试。

您需要做的就是编写一个 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;
}
于 2013-07-08T10:42:28.257 回答
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.
      }
 }

希望这可能对你有帮助

于 2013-07-08T11:46:50.503 回答