Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .

El enlace a la publicación original, lo encontrarás al final de este artículo.

Siga y complete una mezcla de prueba de Learn MOAR Winter '22 para administradores o desarrolladores antes del 31 de octubre para obtener una insignia comunitaria especial y tener la oportunidad de ganar uno de los cinco cupones de certificación de Salesforce (hasta un valor de $ 200 USD). Se aplican restricciones. Aprenda a participar y revise las Reglas Oficiales visitando la página de preguntas de Learn MOAR .

El lanzamiento de Winter '22 trae nuevas y emocionantes características para los desarrolladores de Apex. En esta publicación, le brindaremos una vista previa de tres de nuestros favoritos: un nuevo método Enum valueOf (), que llama a acciones invocables desde Apex y usa respuestas simuladas para probar las funciones de Salesforce.

Método de valueOf()

Comencemos explorando el nuevo valueOf() en la clase Enum . Este método le permite convertir una String en un valor constante Enum Antes de Winter'22, para obtener un Enum de la cadena, tenía que recorrer todos los valores buscando un nombre coincidente. En lugar de, por ejemplo, tener que crear un mapa que vincule la cadena y las constantes Enum para realizar la búsqueda, simplemente puede usar Enum.valueOf() .

 público con clase de intercambio EnumValueOf { public enum Temporada {INVIERNO, PRIMAVERA, VERANO, OTOÑO} public static void convertStringToEnumConstant () { String currentSeasonInput = 'INVIERNO'; // Antes - buscando los valores () Mapa <Cadena, Temporada> temporadasByName = nuevo Mapa <Cadena, Temporada> (); para (Season enumValue: Season.values ()) { SeasByName.put (enumValue.name (). toUpperCase (), enumValue); } Temporada currentSeason = seasonsByName.get (currentSeasonInput); System.debug ('Temporada actual (técnica anterior):' + temporada actual); // Con Winter'22 Temporada currentSeasonWithValueOf = Season.valueOf (currentSeasonInput); System.debug ('Temporada actual (nueva técnica):' + currentSeasonWithValueOf); }
}

Esta función aborda una solicitud de IdeaExchange: Apex Enum parse from string .

Llamar a acciones invocables desde Apex (vista previa para desarrolladores)

La versión Winter'22 incorpora la capacidad de invocar acciones invocables desde Apex . Las acciones invocables son acciones automatizadas que se pueden invocar desde diferentes puntos de entrada, como la API REST, Flow o Process Builder. Son una de las mejores herramientas de Salesforce para hacer las cosas rápidamente. A partir de Winter'22, podrás invocarlos en Apex. Esto agrega una herramienta más al conjunto de herramientas para desarrolladores de Apex, lo que facilita y agiliza la implementación de ciertos tipos de automatización, la reutilización del código y crea un puente más entre el desarrollo de código bajo y el desarrollo de código profesional.

Tenga en cuenta que esta función está en la vista previa para desarrolladores. Puede activarlo en organizaciones CallIAFromApex al incluir la función CallIAFromApex en el archivo de configuración de la organización temporal.

 { "orgName": "Ejemplos de Winter'22", "edition": "Desarrollador", "características": ["CallIAFromApex"],
}

Echemos un vistazo a algunos ejemplos. Primero, exploremos cómo invocar acciones estándar. Cada botón y enlace en Salesforce puede considerarse una acción estándar; eche un vistazo a una lista completa de acciones estándar disponibles . En este ejemplo, invocamos una acción invocable estándar para crear una publicación de Chatter:

 public static void callStandardInvocableAction () { Invocable.Action action = Invocable.Action.createStandardAction ('chatterPost'); action.setInvocationParameter ('text', '¡Me encanta el nuevo sitio web para desarrolladores!'); action.setInvocationParameter ('tipo', 'Usuario'); action.setInvocationParameter ('subjectNameOrId', UserInfo.getUserId ()); Lista <Invocable.Action.Result> results = action.invoke (); if (results.size ()> 0 && results [0] .isSuccess ()) { System.debug ('Feed Item Id:' + results [0] .getOutputParameters (). Get ('feedItemId')); }
}

Para llamar a la acción, primero instanciamos el createStandardAction de la nueva Invocable.Action Apex. Luego, establecemos los parámetros de invocación y, finalmente, lo invocamos llamando al método de invoke El método devuelve una lista de Invocable.Action.Result que puede explorar para averiguar si la operación tuvo éxito o falló o recuperar la salida.

Esta función no se limita a las acciones invocables estándar; también puede llamar a acciones invocables personalizadas. Las acciones invocables personalizadas se definen en Apex . Usted especifica las entradas, salidas y lo que hará el método. Por ejemplo, aquí tenemos una acción invocable personalizada que recibe un nombre de mascota como parámetro y devuelve una String , construyendo una oración:

 público con clase de intercambio SampleInvocableAction { @InvocableMethod (label = 'Construir oración') public static List <String> tellMeSomething (List <String> mascota) { String mascotName = mascot == null || mascot.isEmpty () || String.isBlank (mascota [0])? 'Appy': mascota [0]; return new List <String> {mascotName + 'cree que el nuevo sitio web para desarrolladores es increíble !!'}; }
}

Ahora podemos crear una instancia de la acción con createCustomAction , establecer el parámetro esperado e invocarlo:

 public static void callCustomInvocableAction () { Invocable.Action action = Invocable.Action.createCustomAction ('apex', 'SampleInvocableAction'); action.setInvocationParameter ('mascota', 'Codey'); Lista <Invocable.Action.Result> results = action.invoke (); if (results.size ()> 0 && results [0] .isSuccess ()) { System.debug ('El resultado es:' + resultados [0] .getOutputParameters (). Get ('salida')); }
}

¡Eche un vistazo a todos los métodos disponibles para las nuevas Invocable.Action , Invocable.Action.Result e Invocable.Action.Error en las notas de la versión !

Utilice respuestas simuladas para probar las funciones de Salesforce

Finalmente, vayamos a nuestro tercer tema, ¡nuestras queridas Funciones! Está previsto que las funciones estén disponibles de forma general en la versión Winter'22. Como parte de esta versión, hemos creado algunas clases e interfaces para ayudarlo a escribir fácilmente pruebas de Apex para invocaciones de funciones .

Echemos un vistazo a algunos ejemplos. Usaremos una función arbitraria solo para ilustrar cómo funcionan las pruebas. De hecho, el código que usamos aquí no importa, ya que el simulacro responderá durante la ejecución de la prueba en lugar de la función subyacente.

 module.exports = función asíncrona (evento, contexto, registrador) { // Haz algo aquí
}

Para probar la invocación de una función, deberá proporcionar una implementación simulada para la función. La clase simulada necesita implementar la nueva functions.FunctionInvokeMock y especificar la respuesta simulada enviada al respond() cuando el tiempo de ejecución de Apex llama a la función. Al usar los createSuccessResponse() y createErrorResponse() en la clase simulada, puede emular el éxito o el fracaso de la invocación de la función.

 La clase pública FunctionsInvokeMockInner implementa functions.FunctionInvokeMock { public Boolean throwError = false; private String invocationId = '000000000000000'; funciones públicas.FunctionInvocation responder (String functionName, String payload) { if (throwError) { funciones de retorno.MockFunctionInvocationFactory.createErrorResponse ( invocationId, functions.FunctionErrorType.FUNCTION_EXCEPTION, '¡La función devolvió un error!'); } return functions.MockFunctionInvocationFactory.createSuccessResponse (invocationId, 'Success!'); } }

En este simulacro de muestra, por defecto emulamos una respuesta exitosa. Si la variable throwError true , emulamos un error.

Echemos un vistazo a un método en la SampleFunctionCall que invoca la función de muestra de forma sincrónica:

 public static void callFunctionSynchronously () { // Llamar a la función sincrónicamente functions.Function myFunction = functions.Function.get ('ejemplo.myfunction'); functions.FunctionInvocation invokeResult = myFunction.invoke ('{}'); // Publicar en Chatter si hay error postToChatter (invokeResult);
}

El postToChatter() envía un mensaje a Chatter, indicando si la función se ejecutó correctamente o si ocurrió un error:

 postToChatter vacío estático privado (functions.FunctionInvocation invokeResult) { FeedItem post = nuevo FeedItem (); post.ParentId = UserInfo.getUserId (); if (invokeResult.getStatus () == functions.FunctionInvocationStatus.ERROR) { post.Title = 'Error al procesar la función'; post.Body = 'Error:' + invokeResult.getError (). getMessage (); } demás { post.Title = 'Función ejecutada con éxito'; post.Body = 'ID de invocación:' + invokeResult.getInvocationId (); } insertar publicación;
}

Así es como podemos probar el método callFunctionSynchronously()

 @isTest
static void testSyncFunctionCall () { // Establecer una clase simulada para responder a las invocaciones de funciones Test.setMock (functions.FunctionInvokeMock.class, new FunctionsInvokeMockInner ()); // Llamada a función síncrona Test.startTest (); SampleFunctionCall.callFunctionSynchronously (); Test.stopTest (); // Verifique que se haya creado correctamente la publicación de Chatter Lista <FeedItem> publicaciones = [SELECCIONAR Título, Cuerpo DE FeedItem ORDENAR POR Fecha de creación DESC LIMIT 1]; System.assertEquals (1, posts.size ()); FeedItem publicación = publicaciones [0]; System.assertEquals ('Función ejecutada con éxito', post.Title); System.assertEquals ('ID de invocación: 000000000000000', post.Body);
}

En el ejemplo, le indicamos al tiempo de ejecución de Apex que envíe la respuesta falsa llamando a Test.setMock() . El primer argumento de Test.setMock() es functions.FunctionInvokeMock.class , y el segundo argumento es una nueva instancia de su implementación de la interfaz functions.FunctionInvokeMock

Cuando Test.setMock() , en realidad no se invoca la función real. En su lugar, se recibe la respuesta simulada que especificó en el respond() En este caso, nos burlamos de una invocación exitosa, por lo que debería haberse creado una publicación exitosa de Chatter.

En el caso de invocar una función de forma asincrónica, deberá especificar una devolución de llamada para procesar la salida de la función, como se ve en este segundo ejemplo:

 public static void callFunctionAsynchronously () { // Llamar a la función de forma asincrónica functions.Function myFunction = functions.Function.get ('ejemplo.myfunction'); myFunction.invoke ('{}', new SampleFunctionCallback ());
}

El callFunctionAsynchronously() , reutiliza el postToChatter() mostrado arriba.

 público con clase de uso compartido SampleFunctionCallback implementa functions.FunctionCallback { public void handleResponse (functions.FunctionInvocation invokeResult) { postToChatter (invokeResult); }
}

Podemos probar la invocación de la función asíncrona de la misma manera que lo hicimos con la de sincronización.

 @isTest
testAsyncFunctionCallError vacío estático () { // Establecer una clase simulada para responder a las invocaciones de funciones FunctionsInvokeMockInner mock = new FunctionsInvokeMockInner (); mock.throwError = true; Test.setMock (functions.FunctionInvokeMock.class, simulacro); // Invocación de función asíncrona con devolución de llamada Test.startTest (); SampleFunctionCall.callFunctionAsynchronously (); Test.stopTest (); // Verifique que se haya creado la publicación de Chatter Lista <FeedItem> publicaciones = [SELECCIONAR Título, Cuerpo DE FeedItem ORDENAR POR Fecha de creación DESC LIMIT 1]; System.assertEquals (1, posts.size ()); FeedItem publicación = publicaciones [0]; System.assertEquals ('Error al procesar la función', post.Title); System.assertEquals ('Error: ¡La función devolvió un error!', Post.Body);
}

En este ejemplo, throwError el error (estableciendo throwError en true ), de modo que la función simulacro dispara un error. Luego, verificamos que se haya creado la publicación de error de Chatter.

¡Ahora tiene todas las herramientas necesarias para comenzar a escribir funciones! Eche un vistazo a nuestra aplicación de muestra Functions Recipes para obtener más información.

Próximos pasos

Si desea profundizar en estas nuevas características de Apex que llegarán en Winter '22, consulte el repositorio de GitHub rr-winter22 .

Sobre el Autor

Alba Rivas trabaja como defensora principal de desarrolladores en Salesforce. Se centra en los componentes web Lightning y la estrategia de adopción de Lightning. Puedes seguirla en Twitter @AlbaSFDC .

Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/09/learn-moar-in-winter-22-with-apex-enhancements.html

Entradas recomendadas