2012-08-17 27 views
5

Tôi chưa thể nhận được bất kỳ thông tin đáng tin cậy nào về vấn đề này trực tuyến. Nhưng tôi nghĩ rằng nó phải là một vấn đề mà phải ảnh hưởng đến rất nhiều người.Salesforce: Tránh giới hạn thống đốc trong các lớp Kiểm tra trên bảng

Về cơ bản tôi đã viết một trình kích hoạt và lớp thử nghiệm đơn giản trong hộp cát, đã kiểm tra nó và khi nào tôi đã triển khai nó thành PRD.

Tôi đã thử chế độ xác thực trước và tôi gặp phải lỗi này.

System.LimitException: Quá nhiều truy vấn SOQL: 101

Lỗi này đã được chứng minh là xảy ra ở một số lớp thử nghiệm khác. Vì vậy, tôi cảm thấy rằng các trường hợp thử nghiệm trong kích hoạt của tôi chạy và điều này kết hợp với các trường hợp thử nghiệm còn lại bằng cách nào đó vượt quá giới hạn.

Vì vậy, tổng số truy vấn SOQL trong các bài kiểm tra đơn vị của chúng tôi phải nhỏ hơn 100. Điều này hơi khó để có thể đúng? Tôi có thể tưởng tượng với rất nhiều trường hợp kiểm tra, chắc chắn chúng tôi sẽ cần hơn 100 truy vấn.

Vì vậy, cách để tránh đạt giới hạn này là vì Salesforce chạy tất cả các trường hợp thử nghiệm khi triển khai ngay cả một dòng mã.

Tôi không có bất kỳ nghi phạm thông thường nào ... như SOQL trong vòng lặp for.

UPDATE: 2012/08/19: Tôi bây giờ đăng mã nguồn của lớp kiểm tra và kích hoạt

thử nghiệm Class:

@isTest 

lớp tin TestAccountDuplicateWebsiteTrigger {

static testMethod void myUnitTest() { 
    try{ 
    // TO DO: implement unit test 
    Test.startTest(); 
    Account a1;  
    a1 = new Account(); 
    a1.name = 'GMSTest';  
    a1.Website = 'www.test.com';    



    Account a2;  
    a2 = new Account(); 
    a2.name = 'GMSTest2'; 
    a2.Website = 'www.test.com';    


    Account a3;  
    a3 = new Account(); 
    a3.name = 'GMSTest3'; 
    a3.Website = 'www.test1.com';   


    insert a1; 
    insert a2; 
    //insert a3; 
    Test.stopTest(); 


    } 
    catch (Exception e) 
    { 
    } 

} 

}

Kích hoạt

trigger osv_unique_website_for_account on Account (before insert, before update) { 

    //Map which has no duplicates with website as the key 
    Map<String, Account> accountMap = new Map<String, Account>(); 

    for (Account account: System.Trigger.new) 
    { 
     //Ensure that during an update, if an website does not change - it should not be treated as a duplicate 
     if ((account.Website != null) && (System.Trigger.isInsert ||    
      (account.Website != System.Trigger.oldMap.get(account.Id).Website))) 
      { 
       //check for duplicates among the new accounts in case of a batch 
       if (accountMap.containsKey(account.Website)) 
       { 
        account.Website.addError('Cannot save account. Website already exists.'); 
       } 
       else 
       { 
        accountMap.put(account.Website, account); 
       } 

      }  
    } 

    //Now map containing new account websites has been created. 
    //Check them against the account websites that ALREADY EXIST in salesforce. If website exists, display error. 
    for (Account account : [SELECT Website FROM Account WHERE Website IN :accountMap.KeySet()]) 
    { 
     Account newAccount = accountMap.get(Account.Website); 
     if (newAccount!=null) 
     { 
      newAccount.Website.addError('Cannot save account. Website already exists.'); 
     } 
    } 

}

bạn có thể vui lòng chia sẻ suy nghĩ của bạn?

Cảm ơn,

Calvin

+0

Bạn nhận được thông báo lỗi này vì một trong các lớp kiểm tra của bạn (không phải tất cả chúng!) Vượt quá giới hạn thống đốc. Trong thông báo lỗi bạn có thể thấy Tên lớp. Đăng Mã của lớp đó ở đây để chúng ta có thể kiểm tra nó. – mast0r

+0

Trên thực tế lớp học được hiển thị là một lớp học trong PRD và hiện tại các trường hợp thử nghiệm đang hoạt động tốt. Như John trả lời dưới đây có lẽ nó đã xảy ra bởi vì tôi đã không sử dụng startTest() và stopTest() để kèm theo mã của tôi trong lớp thử nghiệm. –

Trả lời

10

Nó sẽ giúp để xem một số lớp học thử nghiệm của bạn, nhưng một điều quan trọng cần lưu ý là bạn cần phải tận dụng để Test.startTest() và Test.stopTest() phương pháp. Ý tưởng là bất kỳ truy vấn hoặc hoạt động DML nào mà bạn thực hiện để thiết lập thử nghiệm của mình phải nằm trước phương thức Test.startTest(). Sau đó, khi kiểm tra mã của bạn như thực hiện một phương pháp bạn đang thử nghiệm làm điều đó giữa các cuộc gọi bắt đầu và dừng phương pháp.

Điều này mang lại ngữ cảnh thử nghiệm đơn vị. Mà về cơ bản sẽ bỏ qua bất kỳ dml hoặc truy vấn được thực hiện bên ngoài của bạn bắt đầu và ngừng thử nghiệm và chỉ đếm những gì xảy ra ở giữa là một phần của thử nghiệm của bạn. Nếu không, tất cả các mã thiết lập và mã thử nghiệm thực tế đều được coi là một phần của cùng một ngữ cảnh và do đó phải được tính vào các giới hạn.

Liên kết này nên làm sáng tỏ thêm về đề tài này: http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods

+0

Chắc chắn đây là một cái gì đó đã được đề nghị cho tôi một thời gian ngắn trước đây. Tôi sẽ thêm hai câu lệnh trong lớp kiểm tra của tôi. Cảm ơn. –

+0

hey John, tôi đã thêm những phát biểu này vào lớp kiểm tra của tôi và nó không giúp ích gì. Bây giờ tôi đã đăng lớp thử nghiệm và mã kích hoạt trong bài đăng gốc của tôi ở trên. –

+0

Đánh dấu là câu trả lời. Sử dụng force.com IDE tôi đã có thể tìm ra vấn đề trong lớp khác. Tôi đã sử dụng starttest và stoptest ở nơi thích hợp. –

1

Một điều cần lưu ý là SOQL rằng bạn đang thực hiện tại của bạn cho vòng lặp. Bạn có thể tạo danh sách và lưu trữ kết quả truy vấn của bạn trước vòng lặp của bạn .. Bằng cách đó bạn sẽ không gặp vấn đề với giới hạn của thống đốc vì bạn chỉ sử dụng một tuyên bố SOQL cho mỗi giao dịch.

+0

Yup đây là điều đầu tiên tôi kiểm tra trước khi tiếp tục tìm kiếm bất kỳ lỗi nào khác trong mã hóa. –

+0

Cảm ơn Richards ..! Bạn có thể kiểm tra câu hỏi này không? Cảm ơn !! http://stackoverflow.com/q/12183564/1633936 – JeyJim

+0

Tôi đã trả lời ... cho tôi biết nếu bạn cần thêm trợ giúp ở đó. –

Các vấn đề liên quan