2013-02-28 168 views
0

我工作的解决方案张贴在这里:http://mysalesforcecode.blogspot.com/2012/09/how-to-copy-record-owner-from-cloning.html失败的测试类

就像希望的按钮和触发的工作,但我不断收到测试失败归因于第二系统在我的测试(测试如果断言机会主人是按照原来的主人场保留我的顶点新手,所以我可以做一些显然是错误的......希望如此 - 由于

按钮:!

{!URLFOR($Action.Opportunity.Clone,Opportunity.Id,  
[cloneli=1,opp11='Prospecting',opp12='10',opp9= 
TEXT(MONTH(Opportunity.CloseDate))+"/" 
+TEXT(DAY(Opportunity.CloseDate))+"/" 
+TEXT(YEAR(Opportunity.CloseDate)+1) 
])}&00NZ0000000kfYf={!Opportunity.OwnerId}&retURL={!Opportunity.Id} 

触发(每更新回答如下):

trigger OwnerIdChange on Opportunity (before insert) 
{ 
for(Opportunity o : Trigger.new) 
{ 
    if(o.OriginalOwner__c != null) 
    o.OwnerId = o.OriginalOwner__c; 
} 
} 

测试类:

@istest 
private class Opportunities_Test { 

    static testMethod void Opportunities_Test1() { 
    test.starttest(); 

     Profile p = [SELECT Id FROM Profile WHERE Name='Standard User']; 
     User u = new User(Alias = 'standt', Email='[email protected]', 
     EmailEncodingKey='UTF-8', LastName='Testing', LanguageLocaleKey='en_US', 
     LocaleSidKey='en_US', ProfileId = p.Id, 
     TimeZoneSidKey='America/Los_Angeles', UserName='[email protected]'); 
     insert u; 

     Profile s = [SELECT Id FROM Profile WHERE Name='System Administrator']; 
     User u2 = new User(Alias = 'admin', Email='[email protected]', 
     EmailEncodingKey='UTF-8', LastName='Testing2', LanguageLocaleKey='en_US', 
     LocaleSidKey='en_US', ProfileId = s.Id, 
     TimeZoneSidKey='America/Los_Angeles', UserName='[email protected]'); 
     insert u2; 

    Account a = new account(Name = 'Test1'); 
    insert a; 

    List <Opportunity> Opportunity; 
      Opportunity O1 = new Opportunity(); 
      O1.ownerid = u.id; 
      O1.accountid = a.id; 
      O1.Amount= 1; 
      O1.CloseDate = Date.today(); 
      O1.Name = 'Testing'; 
      O1.StageName= 'Prospecting'; 
      insert O1; 

Account b = new account(Name = 'Test2'); 
insert b; 

     List <Opportunity> Opportunity2; 
     Opportunity O2 = new Opportunity(); 
     O2.accountid = b.id; 
     O2.ownerid = u.id; 
     O2.Amount= 1; 
     O2.CloseDate = Date.today(); 
     O2.Name = 'Testing2'; 
     O2.StageName= 'Prospecting'; 
     O2.OriginalOwner__c= u2.id; 
     insert O2; 


List<Opportunity> z = [SELECT Id, Ownerid, Name FROM Opportunity WHERE id= :O2.id]; 

system.assertEquals(O1.ownerid, u.id); 
system.assertEquals(O2.OwnerID, u2.id); 

    test.stoptest();   
    } 
} 
+0

我编辑了当前的代码。有趣的是,尽管测试类最终因第二个系统断言而失败,但触发器说它具有100%的覆盖率。当然,我可以通过删除断言来让测试类通过,但我确实想要这样做。 – user2120892 2013-03-06 17:09:47

+0

截至今天,仍然没有最终的解决方案......请参阅我在3月6日18:13最后的评论(下方) - 该过程在沙箱中正常工作(保持原始机会所有者使用按钮时)。我只是无法通过测试课程。 – user2120892 2013-03-12 19:59:36

回答

1

,您的触发逻辑是有点疯狂,尝试将其更改为以下,看看你得到不同的结果。

trigger OwnerIdChange on Opportunity (before insert) 
{ 
    for(Opportunity o : Trigger.new) 
    { 
     if(o.OriginalOwner__c != null) 
     o.OwnerId = o.OriginalOwner__c; 
    } 
} 

编辑:每下方的评论也应该指出的是,他插入和更新他们后,他没有得到记录的更新值。重新查询机会记录并基于那些返回值进行断言。

+0

博客中的触发器令人困惑。使用Trigger.new.clone()是没有意义的。 由jonnybro发布的触发器做同样的事情,它适用于批量更新(不知道如何做批量克隆)。重要的是在执行克隆之前让按钮设置OriginalOwner__c。 – Acuariano 2013-03-01 12:13:55

+0

@jonnybro感谢您的回复。我更新了触发器,并且在第二个系统断言中运行apex测试时仍然得到相同的错误:错误消息\t System.AssertException:断言失败:预期:005Z0000000tb5YIAQ,实际:005Z0000000tb5ZIAQ – user2120892 2013-03-05 17:00:35

+0

@ user2120892您需要重新查询所有者值为插入后的第二次机会。只有这样你才能得到由触发器设置的值。 – jonnybro 2013-03-06 07:14:39