当前位置: 首页 > 知识库问答 >
问题:

使用Apex触发器的Slack到Salesforce集成,未涵盖测试类

爱繁
2023-03-14

我正在尝试使用Apex触发器而不是process builder来集成Slack。我找到了一种使用触发器来执行它的方法,它完全符合我的要求。然而,我无法获得适当的测试覆盖率,并且该方法也通过了,没有错误。

我对这种类型的集成相当陌生。我确信我错过了一些我无法弄清楚的东西。

我也有其他方法,我正在从Apex类调用这些方法,但我想如果我能涵盖一个方法,我将能够与其他方法一起工作。见下文:

Apex触发器:(50%测试覆盖率):

触发SalesforceToSlackOppTrigger on Opportunity(插入后、更新后){

Id NewRecordTypeId = Schema.SObjectType.Opportunity.getRecordTypeInfosByName().get('New').getRecordTypeId();

List<Id> opptyIds = new List<Id>();

if(SalesforceToSlack.isFirstTime) {
    for(Opportunity opp:Trigger.new){

        SalesforceToSlack.isFirstTime = false;
        Account acct = [SELECT Id, CRM_Owner__c FROM Account WHERE Id =: Opp.AccountId];
        if((opp.RecordTypeId == NewRecordTypeId && opp.isClosed == true && opp.isWon == True && acct.CRM_Owner__c == null) 
        && (opp.OwnerId != '00536000003AUNV' && opp.OwnerId != '00536000001i9UG')){
            opptyIds.add(opp.Id);
            if(opptyIds.size() > 0){
                SalesforceToSlack.OppWonPushToSlack(opptyIds);
            }
        }
    } 
}   

}

Apex等级(1%测试覆盖率):

public类SalesforceToSlack{private static final String OppWonSlackURL='WEBHOOK\u URL'//出于隐私考虑,已编辑掉

public static void OppWonPushToSlack(List opportunityId){Id oppId=opportunityId[0];//如果是批量,则仅先发布以避免重载松弛通道机会o=[选择Id、Name、CloseDate、Account.Name、Owner.Name FROM Opportunity,其中Id=:oppId];Map msg=new Map();msg.put('text',请为salesforce中的以下新opportunity分配CRM所有者:“”\n机会名称:'o.名称“”\n公司名称:'o.Account.Name“”\n关闭日期:'o.CloseDate“”\n机会所有者:'o.owner.Name“”\n链接:'https://cs14.salesforce.com/‘o.id’;消息。put('mrkdwn',true);字符串体=JSON。序列化(msg)
系统。enqueueJob(新的QueueableSlackCall(OppWonSlackURL,'POST',body));}

公共类QueueableSlackCall实现系统。可排队,数据库。允许标注{

    private final String url;
    private final String method;
    private final String body;

    public QueueableSlackCall(String url, String method, String body) {
        this.url = url;
        this.method = method;
        this.body = body;
    }

    public void execute(System.QueueableContext ctx) {
        HttpRequest req = new HttpRequest();
        req.setEndpoint(url);
        req.setMethod(method);
        req.setBody(body);
        Http http = new Http();
        if (!Test.isRunningTest()) {
            HttpResponse res = http.send(req);
        }    
    }
}

}

Apex测试等级:

@isTest公共类SalesforceToSlackTest{

static testMethod void testOppWonPushToSlack() {
Id NewRecordTypeId = Schema.SObjectType.Opportunity.getRecordTypeInfosByName().get('New').getRecordTypeId();
Id pricebookId = Test.getStandardPricebookId();

Account acct1 = new Account(Name = 'Test Account 1',
                            Company_Type__c = 'Trading',
                            Trading__c = 'Hedge Fund',
                            CRM_Owner__c = null);
Insert acct1;

Product2 prod = new Product2(Name = 'US',
                             isActive = true
                             );
insert prod;

//Create your pricebook entry
PricebookEntry pbEntry = new PricebookEntry(Pricebook2Id = pricebookId,
                                            Product2Id = prod.Id,
                                            UnitPrice = 10000,
                                            IsActive = true
                                            );
insert pbEntry;
Opportunity newOpp = new Opportunity(Name = 'New Opportunity',
                                    CloseDate = System.today(),
                                    StageName = '1. Initiated Evaluation',
                                    Type ='New',
                                    RecordTypeId = NewRecordTypeId,
                                    AccountId = acct1.Id,
                                    Payment_Terms__c = 'Annual',
                                    Contract_Start_Date__c = System.today(),
                                    Contract_End_Date__c = System.today() + 364,
                                    Amount = 10000,
                                    OwnerId = userinfo.getuserid());



Insert newOpp;
OpportunityLineItem oli = new OpportunityLineItem(OpportunityId = newOpp.Id,
                                                  PricebookEntryId = pbEntry.Id,
                                                  Quantity = 1,
                                                  UnitPrice = pbEntry.UnitPrice
                                                  );
Insert oli; 
Test.startTest();
newOpp.StageName = 'Contract Signed';
Update newOpp;    
Test.stopTest();
Opportunity OppRecord = [select StageName from Opportunity where Id =: newOpp.Id];

System.assertEquals('Contract Signed',OppRecord.StageName);
}

}

共有1个答案

养鸿运
2023-03-14

测试中不支持调用。您有两个选择:1.使用test.isRunningTest()来避免在测试期间调用新的Http(). send()方法2.使用HttpCalloutMock接口来提供对代码中的调用的模拟响应。(我推荐这个,因为它更酷,也是一个更好的测试策略)

HttpCalloutMock接口

测试标注

 类似资料:
  • 我已经为此发疯了。我的IF循环中没有任何东西通过我的测试类触发,我不知道为什么。我在网上阅读了很多,看起来我做的事情是正确的,但它仍然没有解决我的代码覆盖率。这是运行的最后一行:如果(isIn==True){ 之后我无法让任何东西在IF循环中运行,我已经颠倒了逻辑,它仍然无法运行。我觉得当有人指出它时,我会踢自己,但这是我的代码: } 这是我的测试类:

  • 我已在Salesforce APEX中记录了触发器。它工作正常。 触发器代码为: 现在我正在尝试为它的测试类编写代码。它在线上给出错误,说对象无法解析为字符串。 测试等级代码为: 期待找到解决方案。任何帮助都将不胜感激。 谢谢

  • 我在Apex中有一个触发器。如何编写检查触发器是否被调用的单元测试?

  • 下面是我的顶点触发器。我是一名初学者,正在尝试编写其测试类,但不断出现错误“System.DmlException:Insert失败。第0行出现第一个异常;第一个错误:REQUIRED\u FIELD\u MISSING,错误:只有在产品相关列表上为此opportunity选择了价格手册,才能选择产品。:[]”。 在Opportunity上触发TrgrOptyHighestCustmorePric

  • 大家好, 我正在尝试为我帮助编写的触发器编写一个测试类。触发器使用名为trigger\u help\u c的字段,该字段是通过添加opportunity Type和Account ID派生的公式字段,如果在过去90天内已在该帐户上创建了该类型的opportunity,则在插入之前激发。除非配置文件是系统管理员。这是我的触发器: 我在写测试课时遇到了困难,我像往常一样不知所措。我写了以下内容,但我不

  • 你好 我正在Salesforce内部为trigger进行单元测试,我不断遇到一个似乎无法解决的错误,所以我希望有更多经验的人能帮助我回到正轨。我已经在Google上搜索过很多次了,我的代码结构也被弄乱了,但我找不到解决方案。 目的: 我的任务是编写一个触发器,该触发器将处理维护每个开发人员的案例排名所需的逻辑。每个开发人员都被分配了案例,这些案例可能有也可能没有由业务确定的优先级。每个开发人员在任