Probar desencadenadores de Apex
Objetivos de aprendizaje
Después de completar esta unidad, podrá:
- Escribir una prueba para un desencadenador que se active en una operación con un solo registro.
- Ejecutar todos los métodos de una clase.
Requisitos previos
Vamos a probar un disparador con el que hemos trabajado en el módulo Desencadenador de Apex. Si un registro de cuenta tiene oportunidades relacionadas, el desencadenador AccountDeletion impide la eliminación del registro.
Si aún no ha agregado el desencadenador AccountDeletion, realice estos pasos.
- En la Consola web, presione Ctrl+Shift+P (Windows) o ⌘+Shift+P (macOS) para abrir la Paleta de comandos.
- Ingrese
SFDX: Create Apex Trigger(SFDX: Crear desencadenador de Apex).y presione Intro.
- Para el nombre del desencadenador, ingrese
AccountDeletiony, luego, presione Intro.
- Para el sObject, seleccione Account (Cuenta) y, luego, presione Intro.
- Para el evento del desencadenador, seleccione before delete (antes de eliminar) y, luego, presione Intro.
- Para el directorio de salida, seleccione force-app/main/default/triggers y, luego, presione Intro.
- Reemplace el cuerpo predeterminado del desencadenador por este ejemplo.
trigger AccountDeletion on Account (before delete) {
// Prevent the deletion of accounts if they have related opportunities.
for(Account a : [SELECT Id FROM Account
WHERE Id IN (SELECT AccountId FROM Opportunity) AND
Id IN :Trigger.old WITH USER_MODE]) {
Trigger.oldMap.get(a.Id).addError('Cannot delete account with related opportunities.');
}
}Si ha agregado el desencadenador AccountDeletion en una unidad anterior, pero lo ha desactivado para que el sistema pueda comprobar su reto, vuelva a activarlo.
- En Configuración, busque
Apex Triggers(Desencadenadores de Apex).
- En la página Desencadenadores de Apex, haga clic en Edit (Modificar) junto al desencadenador
AccountDeletion.
- Seleccione Is Active (Está activo).
- Haga clic en Guardar.
Si la organización tiene desencadenadores de una unidad anterior llamados AddRelatedRecord, CalloutTrigger o HelloWorldTrigger, desactívelos. Por ejemplo, para desactivar el desencadenador AddRelatedRecord:
- En Configuración, busque
Apex Triggers(Desencadenadores de Apex).
- En la página Desencadenadores de Apex, haga clic en Modificar junto al desencadenador
AddRelatedRecord.
- Anule la selección de Is Active (Está activo).
- Haga clic en Guardar.
Para desactivar los desencadenadores HelloWorldTrigger y CalloutTrigger, repita los pasos anteriores.
Agregar y ejecutar una prueba de unidad
Antes de implementar el desencadenador, escriba pruebas de unidad que activen el desencadenador y compruebe si los resultados son los esperados.
Primero, vamos a empezar por agregar un método de prueba. Este método de prueba determina para qué se ha diseñado el desencadenador (caso positivo): impedir la eliminación de una cuenta si tiene oportunidades relacionadas.
- En la Consola web, presione Ctrl+Shift+P (Windows) o ⌘+Shift+P (macOS) para abrir la Paleta de comandos.
- Ingrese
SFDX: Create Apex Class(SFDX: Crear una clase de Apex) y presione Intro.
- Para el tipo de plantilla, seleccione DefaultApexClass y, luego, presione Intro.
- Para el nombre de clase, ingrese
TestAccountDeletiony, luego, presione Intro.
- Para el directorio de salida, seleccione force-app/main/default/classes y, luego, presione Intro.
- Sustituya el cuerpo de clase predeterminado por el siguiente.
@IsTest
private with sharing class TestAccountDeletion {
@IsTest
static void TestDeleteAccountWithOneOpportunity() {
// Test data setup
// Create an account with an opportunity, and then try to delete it
Account acct = new Account(Name='Test Account');
insert as user acct;
Opportunity opp = new Opportunity(
Name=acct.Name + ' Opportunity',
StageName='Prospecting',
CloseDate=System.today().addMonths(1),
AccountId=acct.Id);
insert as user opp;
// Perform test
Test.startTest();
Database.DeleteResult result = Database.delete(acct, false, AccessLevel.USER_MODE);
Test.stopTest();
// Verify
// In this case the deletion should have been stopped by the trigger,
// so verify that we got back an error.
Assert.isFalse(result.isSuccess());
Assert.isTrue(result.getErrors().size() > 0);
Assert.areEqual('Cannot delete account with related opportunities.',
result.getErrors()[0].getMessage());
}
}El método de prueba configura primero una cuenta de prueba con una oportunidad. A continuación, elimina la cuenta de prueba, lo que activa el desencadenador AccountDeletion. El método de prueba confirma si el desencadenador ha impedido la eliminación de la cuenta de prueba mediante la comprobación del valor devuelto de la llamada a Database.delete(). El valor devuelto es un objeto Database.DeleteResult que contiene información sobre la operación de eliminación. El método de prueba comprueba si la eliminación no se ha realizado correctamente y el mensaje de error obtenido.
- Guardar la clase de prueba.
- En la Consola web, haga clic en
en la barra de actividades. Se abre el panel lateral Testing (Pruebas).
- En la barra de búsqueda Testing (Pruebas), ingrese
TestAccountDeletion.
- Para ejecutar todos los métodos de prueba en la clase, pase el cursor sobre la línea TestAccountDeletion y haga clic en
.
La clase de prueba TestAccountDeletion contiene un solo método de prueba para probar un único registro de cuenta. Además, esta prueba es para el caso positivo. Pruebe siempre más casos para asegurarse de que el desencadenador funciona en todos los casos, incluidas la eliminación de una cuenta sin oportunidades y las eliminaciones de cuentas masivas.
Los datos de prueba se configuran en el método de prueba, lo cual puede requerir mucho tiempo a medida que agrega más métodos de prueba. Si tiene muchos métodos de prueba, incluya la creación de datos de prueba en una clase de utilidad de prueba y llame a la clase de utilidad desde varios métodos de prueba. En la unidad siguiente se muestra cómo aprovechar una clase de utilidad de prueba y agregar más métodos de prueba.
Más información
El método de prueba contiene el par de métodos Test.startTest() y Test.stopTest(), lo que delimita un bloque de código que obtiene un conjunto nuevo de límites regulados. En esta prueba, la configuración de los datos de prueba usa dos declaraciones DML para poder realizar la prueba. Para comprobar que el código Apex se ejecuta dentro de los límites regulados, aísle el uso de límites de la configuración de datos de los de su prueba. Para aislar el límite de usos del proceso de configuración de datos, encierre la llamada de prueba dentro de Test.startTest() y el bloque Test.stopTest(). Use además este bloque de prueba para las pruebas de Apex asíncrono. Para obtener más información, consulte Uso de límites, startTest y stopTest.
Recursos
- Guía del desarrollador de Apex: Understanding Testing in Apex
- Guía del desarrollador de Apex: Desencadenadores
Preparación para el reto práctico
Para completar el desafío práctico de esta unidad, deberá crear un desencadenador de Apex en el objeto de contacto denominado RestrictContactByName con el siguiente código:
trigger RestrictContactByName on Contact (before insert, before update) {
//check contacts prior to insert or update for invalid data
for(Contact c : Trigger.New) {
if(c.LastName == 'INVALIDNAME') {
//invalidname is invalid
c.AddError('The Last Name "'+c.LastName+'" is not allowed for DML');
}
}
}