Skip to main content

Probar desencadenadores de Apex

Objetivos de aprendizaje

Después de completar esta unidad, podrá hacer lo siguiente:

  • 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.
Nota

Nota

El reto práctico para esta insignia está localizado al japonés, español (LATAM) y portugués (Brasil). Para cambiar el idioma de su Trailhead Playground, siga estas instrucciones. Puede que la localización esté desactualizada. Si no aprueba el reto con las instrucciones localizadas, cambie el idioma a inglés y la configuración local a Estados Unidos, y vuelva a intentarlo.

Consulte la insignia Trailhead en su idioma para aprender a aprovechar la experiencia traducida de Trailhead.

Probar desencadenadores de Apex

Antes de implementar un desencadenador, escriba pruebas de unidad que activen el desencadenador y compruebe si los resultados son los esperados.

Vamos a probar un desencadenador con el que trabajamos en el módulo Desencadenadores de Apex. Si un registro de cuenta tiene oportunidades relacionadas, el desencadenador AccountDeletion impide la eliminación del registro.

Requisitos previos

Si aún no ha agregado el desencadenador AccountDeletion, realice estos pasos.

  1. En Developer Console, haga clic en Archivo | Nuevo | Desencadenador de Apex.
  2. Ingrese AccountDeletion como nombre del desencadenador y, a continuación, seleccione Account (Cuenta) para el sObject. Haga clic en Enviar.
  3. Sustituya el código predeterminado por lo siguiente:
    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]) {
        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.

  1. En Setup (Configuración), busque Apex Triggers (Desencadenadores de Apex).
  2. En la página Desencadenadores de Apex, haga clic en Edit (Modificar) junto al desencadenador AccountDeletion.
  3. Seleccione Is Active (Está activo).
  4. 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:

  1. En Setup (Configuración), busque Apex Triggers (Desencadenadores de Apex).
  2. En la página Desencadenadores de Apex, haga clic en Edit (Modificar) junto al desencadenador AddRelatedRecord.
  3. Anule la selección de Is Active (Está activo).
  4. Haga clic en Guardar.

Para desactivar los desencadenadores HelloWorldTrigger y CalloutTrigger, repita los pasos anteriores.

Agregar y ejecutar una prueba de unidad

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.

  1. En Developer Console, haga clic en Archivo | Nuevo | Clase de Apex.
  2. Ingrese TestAccountDeletion como nombre de la clase y, a continuación, haga clic en OK (Aceptar).
  3. Sustituya el cuerpo de clase predeterminado por el siguiente.
    @isTest
    private 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 acct;
        Opportunity opp = new Opportunity(
          Name=acct.Name + ' Opportunity',
          StageName='Prospecting',
          CloseDate=System.today().addMonths(1),
          AccountId=acct.Id);
        insert opp;
        // Perform test
        Test.startTest();
          Database.DeleteResult result = Database.delete(acct, false);
        Test.stopTest();
        // Verify
        // In this case the deletion should have been stopped by the trigger,
        // so verify that we got back an error.
        System.assert(!result.isSuccess());
        System.assert(result.getErrors().size() > 0);
        System.assertEquals('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 impidió la eliminación de la cuenta de prueba; para ello, comprueba el 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.
  4. Para ejecutar esta prueba, haga clic en Prueba | Nueva ejecución.
  5. Debajo de Test Classes (Clase de prueba), haga clic en TestAccountDeletion.
  6. Para agregar todos los métodos de la clase TestAccountDeletion a la ejecución de prueba, haga clic en Add Selected (Agregar selección).
  7. Haga clic en Ejecutar. Busque el resultado de la prueba en la ficha Pruebas debajo de la última ejecución.

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 probar el código Apex con límites regulados, aísle el uso de límites de la configuración de datos de la prueba. Para aislar el uso de límites del proceso de configuración de datos, incluya la llamada a la prueba en el bloque Test.startTest() y 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.

Nota

Un problema conocido de la consola de desarrollador impide la actualización correcta de la cobertura de código al ejecutar un subconjunto de pruebas. Para actualizar todos los resultados de su cobertura de código, use Prueba | Ejecutar todo en lugar de Prueba | Nueva ejecución.

Recursos

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

    }

  }

}
¡Siga aprendiendo gratis!
Regístrese para obtener una cuenta y continuar.
¿Qué hay para usted?
  • Consiga recomendaciones personalizadas para sus objetivos profesionales
  • Practique sus aptitudes con retos prácticos y pruebas
  • Siga y comparta su progreso con empleadores
  • Póngase en contacto para recibir asesoramiento y oportunidades laborales