【问题标题】:Slack to Salesforce Integration using Apex Trigger, Test Class Not Covered使用 Apex 触发器的 Slack 到 Salesforce 集成,未涵盖测试类
【发布时间】:2018-01-26 01:23:24
【问题描述】:

我正在尝试使用 Apex Trigger 而不是通过流程构建器来集成 Slack。我想出了一种使用触发器执行它的方法,并且可以完美地满足我的要求。但是,我无法获得正确的测试覆盖率,并且该方法也通过了,没有错误。

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

我也有其他方法,我从 Apex Class 调用,但我想如果我能涵盖一种方法,我将能够与其他人一起工作。见下文:

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

在机会上触发 SalesforceToSlackOppTrigger(插入后,更新后) {

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% - 测试覆盖率):

公开课 SalesforceToSlack { private static final String OppWonSlackURL = 'WEBHOOK_URL' //出于隐私考虑

公共静态无效 OppWonPushToSlack(列出机会 ID) { ID oppId = 机会Id[0]; // 如果是bulk,只发post,避免Slack channel 超载 机会 o = [SELECT Id, Name, CloseDate, Account.Name, Owner.Name 来自机会 其中Id =:oppId]; 地图味精 = 新地图(); msg.put('text', '请将 CRM 所有者分配给我们在 salesforce 中的以下新机会:' + '\n机会名称:' + o.Name + '' + '\n公司名称:' + o.Account.Name + '' + '\n关闭日期:' + o.CloseDate +'' + '\n机会所有者:' + o.Owner.Name +'' + '\n链接:' + 'https://cs14.salesforce.com/' + o.id); msg.put('mrkdwn', true); 字符串主体 = JSON.serialize(msg);
System.enqueueJob(new QueueableSlackCall(OppWonSlackURL, 'POST', body)); }

公共类 QueueableSlackCall 实现 System.Queueable、Database.AllowsCallouts {

    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);
}

}

【问题讨论】:

    标签: salesforce httprequest apex slack


    【解决方案1】:

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

    HttpCalloutMock Interface

    Testing callouts

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 2019-06-24
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多