2012-08-17 14 views
5

Bu konuyla ilgili herhangi bir güvenilir bilgiyi çevrimiçi ortamda bulamadım. Ama bence çok fazla insanı etkilemesi gereken bir konu olmalı.Salesforce: Kart üzerindeki Test sınıflarında vali sınırlarından kaçınmak

Temel olarak sanal alanda basit bir tetikleyici ve test sınıfı yazdım, test ettim ve iyi olduğunda PRD'ye yerleştirdim.

İlk önce doğrulama modunu denedim ve bu hatayı aldım.

System.LimitException: Çok fazla SOQL sorguları: 101

Bu hata, başka bir test sınıfında meydana geldiği gösterilmiştir. Bu yüzden, tetikleyicimdeki test durumlarının çalıştığını ve bunun kalan test senaryolarıyla birleştiğini ve bir şekilde limiti aştığını hissediyorum.

Bu nedenle, birim testlerimizde toplam SOQL sorgusu sayısı 100'den az olmalıdır. Bu, doğru bir şekilde eklemek zor mu? Pek çok test vakasıyla hayal edebiliyorum, kesinlikle 100'den fazla sorguya ihtiyacımız var.

Bu nedenle, bu sınırın önüne geçmek için kullanılabilecek yollar nelerdir, çünkü Salesforce, tek bir kod satırı bile dağıtırken tüm test olaylarını çalıştırır.

Herhangi bir olağan şüpheliden yok ... bir döngü içinde SOQL gibi.

GÜNCELLEME: 2012/08/19: Şimdi

Testi Sınıf Test sınıfının kaynak kodunu yayınlayarak ve tetiklemek am:

@isTest 

özel sınıf 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) 
    { 
    } 

} 

}

Tetik

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.'); 
     } 
    } 

}

düşüncelerinizi paylaşabilir misiniz?

sayesinde

Calvin

+0

Bu hatayı alıyorsunuz, çünkü Test sınıflarınızdan biri (hepsi değil!) Vali sınırını aşıyor. Hata mesajında ​​sınıf adını görebilirsiniz. Post Bu sınıfın kodunu buradan kontrol edebiliriz. – mast0r

+0

Aslında, gösterilen sınıf PRD'de olan bir sınıftır ve şu anda test durumları iyi çalışıyor. John'un aşağıda yanıtladığı gibi, kodumun test sınıfında yer alması için startTest() ve stopTest() yöntemini kullanmadım. –

cevap

10
Bu test sınıfları ancak dikkat edilmesi gereken önemli bir şey Test.startTest() ve Test.stopTest için yararlanmak gerektiğidir bazılarını görmek için yardımcı olacağını

() yöntemleri. Buradaki fikir, testinizi yapmak için yaptığınız tüm sorgular veya DML işlemlerinin Test.startTest() yönteminden önce kapalı olmasıdır. Daha sonra kodunuzu test ederken, bir yöntemi yürütmek gibi, test etmek, start ve stop yöntem çağrıları arasında gerçekleştirir.

Bu, birim sınama bağlamını verir. Temelde başlangıçta yaptığınız herhangi bir dml veya sorgusu göz ardı edecek ve testi durduracak ve sadece testinizin bir parçası olarak neler olduğunu hesaba katacaktır. Aksi takdirde, tüm kurulum kodları ve gerçek test kodlarının hepsi aynı içeriğin bir parçası olarak kabul edilir ve dolayısıyla sınırlara sayılır.

Bu bağlantı konuda bazı ek ışık tutacak olmalıdır: http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods

+0

Elbette bunun bir süre önce bana önerilmiş bir şey olduğunu unutmayın. Bu iki ifadeyi test sınıfımda ekleyeceğim. Teşekkürler. –

+0

hey John, Bu ifadeleri test sınıfıma ekledim ve yardımcı olmadı. Test sınıfını ve tetikleyici kodunu şimdi asıl gönderiimde yayınladım. –

+0

Yanıt olarak işaretle. Force.com IDE'yi kullanma Başka bir sınıftaki problemi çözebildim. En iyi ve en iyi olanı uygun bir yerde kullandım. –

1

akılda tutulması gereken bir diğer şey döngü Gözlerinde farklı yürütülüyor SOQL olduğunu. Bir liste oluşturabilir ve sorgunuzun sonuçlarını döngüden önce saklayabilirsiniz. Bu şekilde, yalnızca işlem başına bir SOQL ifadesi kullandığınız için vali limitleriyle ilgili bir sorunla karşılaşmazsınız.

+0

Yup, kodlamada diğer hataları aramaya başlamadan önce kontrol ettiğim ilk şey budur. –

+0

Teşekkürler Richards ..! Bu soruyu kontrol edebilir misin? Teşekkürler !! http://stackoverflow.com/q/12183564/1633936 – JeyJim

+0

Cevap verdim ... Daha fazla yardıma ihtiyacım olursa haberim olsun. –