Salesforce将Apex类部署到生产中0%的代码覆盖率

时间:2019-05-17 09:59:53

标签: salesforce apex apex-code

我正在使用Salesforce,并且想从我的沙箱中部署自定义Apex类。在生产中没有Apex类,估计的代码覆盖率为0%,因此当我尝试部署类时,会出现以下错误

enter image description here

有没有办法部署我的课程?

我要部署的类在这里:

Public class AutoConvertLeads
{
    @InvocableMethod
    public static void LeadAssign(List<Id> LeadIds)
    {

        List<Database.LeadConvert> MassLeadconvert = new List<Database.LeadConvert>();
        for(id currentlead: LeadIds){
                Database.LeadConvert Leadconvert = new Database.LeadConvert();
                Leadconvert.setLeadId(currentlead);                
                Leadconvert.setConvertedStatus('Qualified');
                MassLeadconvert.add(Leadconvert);
        }


        if (!MassLeadconvert.isEmpty()) {
            List<Database.LeadConvertResult> lcr = Database.convertLead(MassLeadconvert);
        }
    }
}

测试类:

@isTest
Private class UnitTest_AutoConvert 
{
    Static TestMethod void AutoConvert()
    {
        // Create the Lead object
        Lead testLead = new Lead(
            FirstName='Demo 100800',
            LastName = 'Demo 100800 UnitTest',
            Status='Qualified',
            company='Lacosta'
        );
        insert  testLead;

        test.StartTest();
        List<Lead> lstOfLeadids = [ testLead.Id ]
        AutoConvertLeads.LeadAssign(lstOfLeadIds)

        test.stopTest();
    }
}

2 个答案:

答案 0 :(得分:1)

您需要将测试班级写到您的班级才能将其移至生产环境。

您可以找到基本的说明here

答案 1 :(得分:1)

为了满足生产部署要求,您必须满足测试要求。从根本上讲,这意味着您必须在生产代码和测试类之间保持75%的行覆盖率。这是从总体上讲的-因此您可以拥有一些覆盖范围不同的Apex类,但它必须占所有代码的75%。此外,所有Apex触发器都需要至少1行测试范围才能通过测试。

很遗憾,您在问题中提供的信息有限。如果您可以为测试类提供代码,这将很有帮助,这样我们可以确定为什么Salesforce在部署期间不执行测试。我最初的猜测是,您没有正确地装饰测试类以使Salesforce 知道这是一个测试类。

如果您想对测试进行友好的介绍,请尝试测试Trailhead:https://trailhead.salesforce.com/en/content/learn/modules/apex_testing

按照Svatopluk的建议查看文档。具体来说,请确保正在发生以下事情:

1)测试类标记为“ @isTest”

2)类中的测试方法在声明中标记为“ @isTest”或“ testMethod”。

3)测试类实际上在您的目标类中实例化并运行代码。

4)在相同的变更集中部署TargetClass和TestClass-这样,Salesforce可以在部署期间实际执行测试。

这是一个示例块:

@isTest
public class TestTargetClass{

    public static testMethod void TestExectuableMethod() {     
        Test.startTest();
        TargetClass instance_tc = new TargetClass();
        instance_tc.executable_method();
        Test.stopTest();
        System.assert(<some sort of test to confirm that your TargetClass operates correctly>);
    }
}

基于发布的测试代码进行编辑:

您的测试代码存在许多问题。 首先,它无法编译,因此我不确定您如何获得通过的测试。

让我们检查以下块中的错误:

    test.StartTest();
    List<Lead> lstOfLeadids = [ testLead.Id ]
    AutoConvertLeads.LeadAssign(lstOfLeadIds)
    test.stopTest();

第二行lstOfLeadids是Lead类型列表,但是您尝试使用ID而不是Lead填充它。 由于AutoConvertLeads.LeadAssign需要使用一个ID列表作为参数,因此它必须是一个ID列表。

您对lstOfLeadids的实例化也是错误的。

您缺少两个分号。

请使用以下代码:

    test.StartTest();
    List<Id> lstOfLeadids = new List<Id>{ testLead.Id };
    AutoConvertLeads.LeadAssign(lstOfLeadIds);
    test.stopTest();

在您实际的AutoConvertLeads类中,您将潜在顾客的状态设置为“合格”。这在我的沙盒上不起作用,但也许会在您的沙盒上起作用。您应该在IsConverted记录的LeadStatus对象上查询MasterLabel,以获取正确的值。