无法在 Salesforce 中使用流程构建器部署 apex class
Cannot deploy apex class with process builder in Salesforce
我想部署一个包含顶点 class、测试 class 和调用顶点 class 的进程构建器的包。在我开发class的沙盒上,代码覆盖率是100%。当我试图将它部署到另一个 sandbox/production 时,它失败了,因为它显示代码覆盖率为 65%。
我认为问题是因为流程构建器在部署时处于非活动状态,因此没有覆盖整个代码。我该如何处理?
我已尝试执行以下操作:
- 在部署 classes 之前,先部署流程构建器以激活它。部署流程构建器失败。
- 在没有进程构建器的情况下部署 classes;代码覆盖率为 65%。
- 更改测试 class 以容纳更多案例。这是不可能的,因为我更改了代码以使用进程构建器,但我找不到测试它的方法。
- 我运行进程生成器激活和停用时的测试代码。它在停用时显示 65% 的覆盖率,在激活时显示 100% 的覆盖率,因为在测试中插入记录时会调用流程构建器 class.
我的代码获取客户电子邮件并使用 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;
}
}
我必须创建帐户记录的克隆 inserted/updated 才能使用流程生成器。使用此方法,更改仅在克隆中进行。如果未使用流程构建器,测试 class 会得到 Null 值而不是 Hashed_email__pc 字段中的实际哈希值,这会导致测试失败。使用流程构建器时,克隆中所做的更改反映在实际记录中,并且测试通过。即使我没有调用这部分代码的测试方法,测试也会通过流程构建器覆盖它。
我想不出创建测试 class 的方法,在停用流程构建器时返回正确的值。我必须使用 DML 来插入记录,以便它可以被克隆。
在这种情况下,我应该如何测试顶点class?
我们发现了部署非活动 PB 的问题。请确保 PB 的部署失败不是因为沙箱的版本比生产版本更新 - 我们 运行 在新版本预览 windows 期间对此进行了研究,当时我们的沙箱通常是即将发布的版本但产品不是。
我们已经开始编写测试 classes 来覆盖我们的流程构建器。您应该能够编写测试来测试通过 PB 处理的预期系统行为。示例:在记录更新时,您的 class 更新各种内容,您的 PB 更新各种其他内容并发送电子邮件提醒。您的测试 class 可以扩展以涵盖 PB 进行的更新并检查它是否按预期发送电子邮件。
希望对您有所帮助。
您是否习惯于将 PB 设置为不活动?还是它在您的包裹中有效?
您是否使用 Eclipce/Migration 工具或更改集来推送代码?
如果 PB 在您的包中处于活动状态,那么它可能是 Scott 提到的组织版本问题。
解决方法是在测试 class 中直接测试您的 class,而不依赖 PB。您可以对对象记录进行增删改查,并在测试中模拟您的PB逻辑class以全面测试您的代码。
我注意到了这一点,但这应该能让你继续前进
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(...)
}
}
我想部署一个包含顶点 class、测试 class 和调用顶点 class 的进程构建器的包。在我开发class的沙盒上,代码覆盖率是100%。当我试图将它部署到另一个 sandbox/production 时,它失败了,因为它显示代码覆盖率为 65%。
我认为问题是因为流程构建器在部署时处于非活动状态,因此没有覆盖整个代码。我该如何处理?
我已尝试执行以下操作:
- 在部署 classes 之前,先部署流程构建器以激活它。部署流程构建器失败。
- 在没有进程构建器的情况下部署 classes;代码覆盖率为 65%。
- 更改测试 class 以容纳更多案例。这是不可能的,因为我更改了代码以使用进程构建器,但我找不到测试它的方法。
- 我运行进程生成器激活和停用时的测试代码。它在停用时显示 65% 的覆盖率,在激活时显示 100% 的覆盖率,因为在测试中插入记录时会调用流程构建器 class.
我的代码获取客户电子邮件并使用 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;
}
}
我必须创建帐户记录的克隆 inserted/updated 才能使用流程生成器。使用此方法,更改仅在克隆中进行。如果未使用流程构建器,测试 class 会得到 Null 值而不是 Hashed_email__pc 字段中的实际哈希值,这会导致测试失败。使用流程构建器时,克隆中所做的更改反映在实际记录中,并且测试通过。即使我没有调用这部分代码的测试方法,测试也会通过流程构建器覆盖它。
我想不出创建测试 class 的方法,在停用流程构建器时返回正确的值。我必须使用 DML 来插入记录,以便它可以被克隆。
在这种情况下,我应该如何测试顶点class?
我们发现了部署非活动 PB 的问题。请确保 PB 的部署失败不是因为沙箱的版本比生产版本更新 - 我们 运行 在新版本预览 windows 期间对此进行了研究,当时我们的沙箱通常是即将发布的版本但产品不是。
我们已经开始编写测试 classes 来覆盖我们的流程构建器。您应该能够编写测试来测试通过 PB 处理的预期系统行为。示例:在记录更新时,您的 class 更新各种内容,您的 PB 更新各种其他内容并发送电子邮件提醒。您的测试 class 可以扩展以涵盖 PB 进行的更新并检查它是否按预期发送电子邮件。
希望对您有所帮助。
您是否习惯于将 PB 设置为不活动?还是它在您的包裹中有效? 您是否使用 Eclipce/Migration 工具或更改集来推送代码? 如果 PB 在您的包中处于活动状态,那么它可能是 Scott 提到的组织版本问题。 解决方法是在测试 class 中直接测试您的 class,而不依赖 PB。您可以对对象记录进行增删改查,并在测试中模拟您的PB逻辑class以全面测试您的代码。
我注意到了这一点,但这应该能让你继续前进
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(...)
}
}