Comparteix via


Crear una funció de C# Power Fx test (visualització prèvia)

Nota

Les característiques de visualització prèvia no estan dissenyades per a un entorn de producció i poden tenir una funcionalitat restringida. Aquestes característiques estan disponibles abans d’un llançament oficial de producte per tal que els clients el puguin utilitzar abans i enviar-nos els seus comentaris.

Microsoft Power Fx és un potent llenguatge de codi baix que s'utilitza i Power Apps es pot ampliar mitjançant C# per crear funcions de prova personalitzades. Aquest article explica com crear una funció de C# Power Fx test, proporcionant una experiència perfecta tant per als creadors com per als desenvolupadors.

El model d'extensibilitat "sense penya-segats" del motor de Power Apps prova garanteix que els usuaris puguin ampliar les Power Apps capacitats del motor de proves sense colpejar cap barrera. Aquest model permet als desenvolupadors crear funcions personalitzades amb C#, que es poden integrar per Power Fx gestionar escenaris complexos.

Mòduls del motor de prova

Els mòduls del motor de prova per a Power Fx dins del motor de prova es construeixen utilitzant el model d'extensibilitat. Podeu utilitzar el codi del producte com a exemples de com es pot ampliar el motor de prova.

Aquí teniu un exemple d'una Power Fx funció que proporciona l'esquema del codi per gestionar un diàleg de consentiment condicional en una aplicació de llenç.

Un diàleg de consentiment és una sol·licitud que apareix als usuaris, demanant-los permís per accedir a determinats recursos o realitzar accions específiques. Aquest diàleg és crucial per mantenir la seguretat i garantir que els usuaris coneguin i acceptin les accions que es prenen en nom seu.

Exemple del diàleg de consentiment de connexió per a una aplicació que es connecta a un SharePoint lloc.

El diàleg de consentiment és important perquè ajuda a evitar l'accés i les accions no autoritzades. Garanteix que els usuaris estiguin informats i donin el seu consentiment explícit abans de realitzar qualsevol operació sensible. Això és important en escenaris en què l'aplicació necessita accedir a les dades de l'usuari o realitzar accions i aquest comportament condicional podria afectar les proves automatitzades.

Un dels reptes dels diàlegs de consentiment és que poden fer que les proves no siguin deterministes. La sol·licitud pot aparèixer condicionalment en funció de diversos factors, com ara permisos d'usuari o interaccions anteriors. Aquesta aparença condicional pot complicar el procés de prova, ja que el motor de proves ha de gestionar aquests diàlegs adequadament.

Abstracció de la complexitat amb Power Fx

Power Fx ajuda a abstraure la complexitat d'esperar condicionalment el diàleg de consentiment i crear connexions si cal. Els creadors poden utilitzar Power Fx per definir la lògica per gestionar els diàlegs de consentiment d'una manera més senzilla i intuïtiva.

Aquí teniu un exemple d'ús Power Fx per gestionar un diàleg de consentiment en una pàgina personalitzada:

Preview.ConsentDialog(Table({Text: "Center of Excellence Setup Wizard"}))

En aquest exemple, la ConsentDialog funció comprova si el diàleg de consentiment és visible. Si és així, la funció pot respondre al diàleg que confirma el consentiment per al compte de prova. Un cop gestionat el diàleg, s'executen els passos de prova restants.

L'argument Table permet que el procés d'espera del diàleg de consentiment surti si es veu una etiqueta amb el text proporcionat.

Ampliació Power Fx de funcions de prova mitjançant C#

L'exemple següent és un exemple de codi d'esquema que es podria utilitzar com a punt de partida per completar aquest exemple:

// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.
using Microsoft.Extensions.Logging;
using Microsoft.Playwright;
using Microsoft.PowerApps.TestEngine.Config;
using Microsoft.PowerApps.TestEngine.TestInfra;
using Microsoft.PowerFx;
using Microsoft.PowerFx.Core.Utils;
using Microsoft.PowerFx.Types;

namespace testengine.module
{
    /// <summary>
    /// This will check the custom pages of a model driven app looking for a consent dialog
    /// </summary>
    public class ConsentDialogFunction : ReflectionFunction
    {
        private readonly ITestInfraFunctions _testInfraFunctions;
        private readonly ITestState _testState;
        private readonly ILogger _logger;
        private static TableType SearchType = TableType.Empty()
              .Add(new NamedFormulaType("Text", FormulaType.String, displayName: "Text"));
    
        /// <summary>
        /// Constructor: Initializes the function with necessary dependencies, 
        /// including ITestInfraFunctions, ITestState, and ILogger.
        /// </summary>
        /// <param name="testInfraFunctions">The test infrastructure functions.</param>
        /// <param name="testState">The test state.</param>
        /// <param name="logger">The logger instance.</param>
        public ConsentDialogFunction(ITestInfraFunctions testInfraFunctions, 
           ITestState testState, 
           ILogger logger) : base(DPath.Root.Append(
               new DName("Preview")), 
               "ConsentDialog", 
               FormulaType.Blank, 
               SearchType)
               {
                  _testInfraFunctions = testInfraFunctions;
                  _testState = testState;
                  _logger = logger;
               }

        /// <summary>
        /// Execute Method: Logs the execution and calls the ExecuteAsync 
        /// method to handle the consent dialog.
        /// </summary>
        /// <param name="searchFor">The table value to search for.</param>
        /// <returns>A blank value.</returns>
        public BlankValue Execute(TableValue searchFor)
        {
            _logger.LogInformation("------------------------------\n\n" +
                "Executing ConsentDialog function.");

            ExecuteAsync(searchFor).Wait();

            return FormulaValue.NewBlank();
        }

        /// <summary>
        /// ExecuteAsync Method: Retrieves the page context and handles the consent dialog with a timeout.
        /// </summary>
        /// <param name="searchFor">The table value to search for.</param>
        /// <returns>A task representing the asynchronous operation.</returns>
        private async Task ExecuteAsync(TableValue searchFor)
        {
            var page = _testInfraFunctions
               .GetContext()
               .Pages
               .Where(p => p.Url.Contains("main.aspx"))
               .First();

            // ... IPage to handle consent dialog with timeout
        }
    }
}

Explicació de l'exemple de ConsentDialogFunction

  • Espai de noms i importacions: importa els espais de noms necessaris i defineix l'espai de testengine.module noms.
  • Definició de classe: La ConsentDialogFunction classe hereta de ReflectionFunction i defineix la funció ConsentDialog personalitzada.
  • Constructor: Inicialitza la funció amb les dependències necessàries, incloent-hi ITestInfraFunctions i ITestState ILogger.
  • Mètode d'execució: registra l'execució i crida el ExecuteAsync mètode per gestionar el diàleg de consentiment.
  • Mètode ExecuteAsync: recupera el context de la pàgina i gestiona el diàleg de consentiment amb un temps d'espera.