我想部署一个包含APEX类,测试类和调用Apex类的过程的软件包。在我开发课程的沙箱上,代码覆盖率为100%。当我尝试将其部署到另一个沙盒/生产中时,它失败了,因为它显示代码覆盖率为65%。
我相信问题是因为过程构建器在部署时无效,因此整个代码未涵盖。我应该如何进行此操作?
我已经尝试执行以下操作:
- 首先部署过程构建器以在部署类之前激活它。部署过程构建器失败。
- 在没有过程构建器的情况下部署类;代码覆盖率为65%。
- 更改测试类以容纳更多案例。这是不可能的,因为我更改了代码来与Process Builder一起使用,因此我找不到一种测试方法。
- 当过程构建器被激活并停用时,我运行了测试代码。它在停用时显示了65%的覆盖范围,激活时的覆盖率为100%,因为在测试类中插入记录时,该过程构建器被调用。
我的代码将客户电子邮件发送并使用cryptoutil.generatehashdigest方法将其转换为哈希,然后将其保存在哈希的电子邮件字段中。
Public static void newRecord(List<Account> listAccounts) {
for(Account a : listAccounts) {
Account updacc=[select id from account where id = :a.id];
String message = String.valueof(a.get('Customer_Email__pc'));
String hashDigest = CryptoUtil.generateHashDigest(message);
updacc.Hashed_email__pc = HashDigest;
update updacc;
}
}
我必须创建插入/更新的帐户记录的克隆,以便使用过程构建器。使用此方法,更改仅在克隆中进行。如果未使用过程构建器,则测试类获取空值,而不是Hashed_email__pc字段中的实际哈希值,从而导致测试失败。当使用过程构建器时,克隆中所做的更改反映在实际记录中,并且测试通过。即使我没有调用该代码部分的测试方法,该过程构建器涵盖了它。
。我无法找到一种创建测试类的方法,其中当过程构建器停用时返回正确的值。我必须使用DML插入记录,以便可以克隆它。
在这种情况下,我应该如何测试Apex类?
我注视着这个,但这应该让你去
public static void newRecord(List<Account> listAccounts)
{
List<Account> accountsToUpdate = new List<Account>();
for(Account a : listAccounts)
{
String message;
String hashDigest;
Account account = new Account();
if(a.Customer_Email__pc != null)
{
message = String.valueof(a.get('Customer_Email__pc'));
hashDigest = CryptoUtil.generateHashDigest(message);
account.Hashed_email__pc = HashDigest;
account.ID = a.ID;
accountsToUpdate.add(account);
}
}
if(!accountsToUpdate.isEmpty())
{
update accountsToUpdate;
}
}
@isTest
private class Test_Account
{
// -------- Variables --------
private static List<Account> testAccount;
// -------- Shared Methods --------
// Initialization of test data example
private static void init(Integer testType)
{
testAccount = new List<Account>();
if(testType == 1)
{
for(Integer i = 0; i < 10; i++)
{
Account a = new Account();
//build your accounts..
testAccount.add(a);
}
insert testAccount;
}
}
// -------- Test Methods --------
private static testMethod void testAccountHash()
{
init(1);
Test.startTest();
//Because this is an actual public method, I would just test the method
newRecord(testAccount);
Test.stopTest();
List<Account> accountResult = [SELECT .... FROM Account];
//Assert
System.assertNotEquals(...)
}
}
我们已经看到了部署无效PB的问题。请确保PB的部署故障并不是因为沙盒在新版本中比生产更新 - 我们在新释放的预览窗口中遇到了该版本,当我们的沙盒通常在即将发布的版本上时,但产品却不是。
我们已经开始编写测试类以覆盖流程构建者。您应该能够编写测试以测试通过PB处理的预期系统行为。示例:在记录更新中,您的类更新各种内容,而您的PB更新各种其他内容,并发送了电子邮件警报。您的测试类可以扩展以涵盖PB的更新,并在预期时检查它是否会发送电子邮件。
希望这会有所帮助。
您是否不得不将PB推动为无活动?还是您的包裹中活跃?您是使用Eclipce/迁移工具还是更改设置来推动代码?如果PB在您的软件包中处于活动状态,那么它可能是Scott提到的ORG版本问题。解决方法是在不依赖PB的情况下直接在测试类中测试您的课程。您可以在对象记录上进行CRUD,并在测试类中模拟您的PB逻辑以完全测试您的代码。