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
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
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. –