2012-08-17 27 views
5

No he podido obtener información confiable sobre este tema en línea. Pero creo que debe ser un problema que debe afectar a muchas personas.Salesforce: evitar los límites del gobernador en las clases de prueba en todos los ámbitos

Básicamente escribí una clase de prueba y desencadenador simple en el entorno limitado, lo probé y cuando estaba bien lo implementé en PRD.

Intenté primero el modo de validación y obtuve este error.

System.LimitException: demasiadas consultas SOQL: 101

Este error se muestran a ocurrir en alguna otra clase de prueba. Así que creo que los casos de prueba en mi disparador se ejecutaron y esto, junto con los casos de prueba restantes de alguna manera sobrepasan el límite.

Así que el número total de consultas SOQL en nuestras pruebas unitarias debe ser inferior a 100. ¿Esto es un poco difícil de aderezar? Me imagino que con tantos casos de prueba, seguramente necesitaremos más de 100 consultas.

¿Cuáles son las formas de evitar alcanzar este límite porque Salesforce ejecuta todos los casos de prueba al implementar incluso una sola línea de código?

No tengo ninguno de los sospechosos habituales ... como SOQL dentro de un bucle for.

ACTUALIZACIÓN: 19/08/2012: Ahora estoy publicando el código fuente de la clase de prueba y el gatillo

clase Test:

@isTest 

clase privada 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) 
    { 
    } 

} 

}

gatillo

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

}

¿Puede usted por favor comparta sus pensamientos?

Gracias,

Calvin

+0

Recibe este mensaje de error porque una de sus clases de prueba (¡no todas!) Excede el límite del gobernador. En mensaje de error, puede ver el nombre de la clase. Publica el código de esa clase aquí para que podamos verificarlo. – mast0r

+0

En realidad, la clase que se muestra es una clase que está en PRD y actualmente los casos de prueba funcionan bien. Como John respondió a continuación, tal vez sucedió porque no utilicé el startTest() y stopTest() para adjuntar mi código en la clase de prueba. –

Respuesta

10

Sería de gran ayuda para ver algunas de las clases de prueba, pero una cosa importante a tener en cuenta es que usted necesita para hacer uso de Test.startTest() y() Test.stopTest métodos. La idea es que todas las consultas o operaciones DML que realice para configurar su prueba estén desactivadas antes del método Test.startTest(). Luego, cuando pruebe su código, como ejecutar un método que está probando, haga eso entre las llamadas al método de inicio y finalización.

Esto proporciona el contexto de prueba de la unidad. Que básicamente ignorará cualquier dml o consultas hechas fuera de su inicio y detendrá las pruebas, y solo contará lo que sucede en el medio como parte de su prueba. De lo contrario, todo el código de configuración y el código de prueba real se consideran parte del mismo contexto y, por lo tanto, están sujetos a contabilizarse dentro de los límites.

Este enlace debe arrojar algo de luz sobre el tema: http://wiki.developerforce.com/page/An_Introduction_to_Apex_Code_Test_Methods

+0

Claro, esto es algo que hace un momento me sugirieron. Agregaré estas dos declaraciones en mi clase de prueba. Gracias. –

+0

hey John, agregué estas declaraciones a mi clase de prueba y no sirvió de nada. Ahora publiqué la clase de prueba y el código de activación en mi publicación original anterior. –

+0

Marcado como respuesta. Usando el IDE de force.com, pude resolver el problema en otra clase. Usé la prueba inicial y la prueba de detención en el lugar apropiado. –

1

Otra cosa a tener en cuenta es la SOQL que se está ejecutando en su bucle. Puede crear una lista y almacenar los resultados de su consulta antes de su ciclo. De esta forma no tendrá que enfrentar un problema con los límites del gobernador porque solo está utilizando una declaración SOQL por transacción.

+0

Sí, esto es lo primero que verifico antes de proceder a buscar cualquier otro error en la codificación. –

+0

Gracias Richards ..! ¿Puedes verificar esta pregunta? Gracias !! http://stackoverflow.com/q/12183564/1633936 – JeyJim

+0

He respondido ... avíseme si necesita más ayuda allí. –

Cuestiones relacionadas