2017-03-06 53 views
0

我想部署具有apex類,測試類和調用apex類的流程構建器的包。在我開發類的沙箱上,代碼覆蓋率爲100%。當我試圖將其部署到另一個沙箱/生產環境時,它失敗了,因爲它顯示代碼覆蓋率爲65%。無法在Salesforce中使用流程構建器部署apex類

我認爲這個問題是因爲流程構建器在部署時不活躍,並且整個代碼沒有被覆蓋。我應該如何繼續?

我已經嘗試做到以下幾點:

  • 首先部署進程生成部署類之前將其激活。部署流程生成器失敗。
  • 部署沒有進程生成器的類;代碼覆蓋率爲65%。
  • 更改測試類以適應更多的案例。這是不可能的,因爲我改變了代碼與流程構建器一起工作,我找不到測試它的方法。
  • 當進程構建器被激活和停用時,我運行了測試代碼。它在停用時顯示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字段中獲取Null值而不是實際的散列值,從而導致測試失敗。使用流程構建器時,克隆中所做的更改將反映在實際記錄中,並且測試通過。即使我沒有調用這段代碼的測試方法,測試也會在流程構建器覆蓋它時通過。

我找不到一種創建測試類的方法,當過程構建器被停用時返回正確的值。我必須使用DML來插入記錄,以便它可以被克隆。

在這種情況下,我應該如何測試apex類?

+0

此代碼是不正確的,如果您加載超過101個賬戶,需要得到修復將無法正常工作。 – EricSSH

+0

我打算對超過101個帳戶使用此代碼。如何改進代碼以避免面臨這個問題?它仍然可以與流程生成器一起工作嗎? – Aish

+0

可以使用異步apex代替嗎? – Aish

回答

1

我eyedballed這一點,但是這應該讓你去

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(...) 

    } 
} 
+0

非常感謝!這是有道理的。它的工作原理。 – Aish

0

我們已經看到部署不活動PB的問題。確保PB的部署失敗並不是因爲沙箱的版本比生產版本更新 - 我們在新版預覽窗口中遇到了這種情況,當時我們的沙箱通常在即將發佈的版本上,但是prod不是。

我們已經開始編寫測試課程來覆蓋我們的流程建立者。您應該能夠編寫測試來測試通過PB處理的預期系統行爲。例如:在記錄更新中,您的班級更新了各種內容,您的班級更新了各種其他內容併發送電子郵件提醒。您的測試課程可以進行擴展以涵蓋PB所做的更新,並檢查是否在預期時發送電子郵件。

希望這會有所幫助。

0

你是否想把PB推到非活動狀態?還是它在你的包中活躍? 您是使用Eclipce/Migration工具還是更改集來推送代碼? 如果PB在您的軟件包中處於活動狀態,那麼它可能是Scott提到的組織版本問題。 解決方法是在不依賴PB的情況下直接在測試類中測試您的類。您可以在對象記錄上執行CRUD並在測試類中模擬您的PB邏輯以充分測試您的代碼。

+0

當我推動它時,PB在包裝中處於活動狀態。我正在使用變更集。我用代碼更新了我的問題,這就解釋了爲什麼直接測試這個類是不可能的。你知道這個解決方法嗎? – Aish