【问题标题】:Assert Statement is failing in Test Class during my Unit Test在我的单元测试期间,断言语句在测试类中失败
【发布时间】:2020-01-03 20:05:56
【问题描述】:

逻辑:

   public static void wmgRemoveOldGroupQueue(Map<Id,Case> newMap, Map<Id,Case> oldMap){
        String wmgRecordTypeId = Schema.SObjectType.Case.getRecordTypeInfosByDeveloperName().get('WMG_Operations_Workflow').getRecordTypeId();
        for (Case o : newMap.values()) {
            
            system.debug('o.OwnerId == '+o.OwnerId+' oldMap.get(o.Id).OwnerId =='+oldMap.get(o.Id).OwnerId);
            system.debug('o.RecordTypeId '+o.RecordTypeId+ 'wmgRecordTypeId'+wmgRecordTypeId);
         
            if (o.RecordTypeId == wmgRecordTypeId && !((String)o.OwnerId).startsWith('005') &&
                (o.OwnerId != oldMap.get(o.Id).OwnerId)) {
                o.ANN_Accepted_From_Queue__c = '';
                    
                    
            }
            system.debug('o.ANN_Accepted_From_Queue__c' +o.ANN_Accepted_From_Queue__c);
            
        }
    }

测试类:

 static testMethod void wmgRemoveOldQueueTest() {        
        //setup 
       	User thisUser = [SELECT Id FROM User WHERE Id = :UserInfo.getUserId()]; 
        String wmgRecordTypeId = Schema.SObjectType.Case.getRecordTypeInfosByDeveloperName().get('WMG_Operations_Workflow').getRecordTypeId();
        String assertMsg = 'Accepted From Queue could not clear out';        
        //QueueSobject q = [SELECT QueueId, Queue.Name FROM QueueSobject WHERE SObjectType = 'Case' and Queue.Name = 'WMG Ops - Licensing' LIMIT 1];
  
        Case c = new Case();
        c.OwnerId = thisUser.Id;
        c.RecordTypeId = wmgRecordTypeId;
        c.ANN_Accepted_From_Queue__c = 'Test';
        insert c;
        System.debug('Owner id at insert is '+c.OwnerId);
 
       
        
       Group testGroup = new Group(Name='test group', Type='Queue');
       insert testGroup;
        
       System.runAs(new User(Id=UserInfo.getUserId()))
  {
    QueuesObject q = new QueueSObject(QueueID = testGroup.id, SObjectType = 'Case');
    insert q;
   } 
      
        //c = [SELECT OwnerId, ANN_Accepted_From_Queue__c, RecordTypeId FROM Case WHERE Id = :c.Id];
        //c.OwnerId = thisUser.Id;
		//update c;
		//System.assertEquals(Test, [SELECT ANN_Accepted_From_Queue__c FROM Case WHERE Id = :c.Id].ANN_Accepted_From_Queue__c, 'Failed');
		system.assertEquals(c.OwnerId, thisUser.Id, 'Failed2');
        

        //c.RecordTypeId = wmgRecordTypeId;
        //system.assert(((String)c.OwnerId).startsWith('00G'), 'Owner issue');
     
        //system.assert(((String)c.OwnerId).startsWith('00G'), 'Owner issue');

                
        case newCase = [SELECT id, Ownerid, ANN_Accepted_From_Queue__c FROM Case WHERE Id = :c.Id];
        newCase.OwnerId=testGroup.Id;
        //QueueSobject q1 = [SELECT QueueId, Queue.Name FROM QueueSobject WHERE SObjectType = 'Case' and QueueID=testGroup.Id LIMIT 1];
          Test.startTest();
         update newCase;
         Test.stopTest();
        
        system.debug('newCase.OwnerId1 =='+newCase.OwnerId);
        case r = [SELECT id, Ownerid, ANN_Accepted_From_Queue__c FROM Case WHERE Id = :newCase.Id];
        system.debug('r Owner Id =='+r.OwnerId);
        System.assertEquals('',[SELECT ANN_Accepted_From_Queue__c FROM Case Where Id=:r.Id].ANN_Accepted_From_Queue__c, assertMsg);
        
        
    }

在这一步失败:System.assertEquals('',[SELECT ANN_Accepted_From_Queue__c FROM Case Where Id=:r.Id].ANN_Accepted_From_Queue__c, assertMsg);

在这一步: system.debug('o.RecordTypeId '+o.RecordTypeId+ 'wmgRecordTypeId'+wmgRecordTypeId);

18:14:23:180 USER_DEBUG [720]|DEBUG|o.OwnerId == 00518000003xRhcAAE oldMap.get(o.Id).OwnerId ==00518000003xRhcAAE 找不到问题所在:

【问题讨论】:

  • 不,我正在努力通过这个单元测试!
  • 我假设这是从触发器调用的。您能否验证该方法实际上是从触发器调用的,并且是在触发器on 定义上定义的上下文中调用的? IE更新前、更新后等
  • 是的,这是在更新之前从触发器调用的:我的单元测试无法进入条件:o.OwnerId != oldMap.get(o.Id).OwnerId .....请帮帮我,因为我需要尽快完成我的单元测试
  • 我面临的主要问题是无法捕捉从 oldMap 和 NewMap 更新 Owner id 之间的区别
  • 还是没有解决办法!!

标签: salesforce code-coverage test-class


【解决方案1】:

这行不通。

当您有一条内存记录(例如您的案例)并插入它时 - 只有生成的记录的 ID 会“神奇地”发送回您的代码。无论记录发生了什么其他变化(触发代码、工作流、流程、流程构建器、公式字段...),您都不会立即在记录中看到它。

您必须查询才能看到新的值(嗯,对于公式,有一个不错的技巧,但其他一切 - 您必须查询)。

制作类似Case newCase = [SELECT OwnerId, ANN_Accepted_From_Queue__c FROM Case WHERE Id = :c.Id]; 的东西,看看它是否有你想要的值。

【讨论】:

  • 嗨:所以我应该遵循的方法来查询插入后的记录,然后它应该去更新......对吗??
  • 触发代码何时触发?好像是“更新前”?插入案例,更改所有者,更新,查询新案例值并在该新案例上运行断言,然后应该没问题。
  • 谢谢,我会尝试 :) 但只是有问题....当我检查代码覆盖率时,我的测试类没有进入条件:(o.OwnerId != oldMap.get( o.Id).OwnerId) ,因此我想没有在特定字段中设置空白值:ANN_Accepted_From_Queue__c = ' ';
  • 我在测试课上做错什么了吗..??
  • 不能这样工作:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2017-04-10
  • 2021-04-14
  • 1970-01-01
  • 2023-04-07
  • 2011-06-11
相关资源
最近更新 更多