Cómo: escribir pruebas unitarias de bases de datos que se ejecuten dentro del alcance de una sola transacción
Si utiliza este método, puede revertir cualquier cambio realizado durante la prueba una vez finalizada la prueba. El siguiente procedimiento ilustra cómo hacer esto: Cree una transacción en un script de prueba Transact-SQL usando BEGIN TRANSACTION y ROLLBACK TRANSACTION. Cree una transacción para un único método de prueba en una clase de prueba. Crea una transacción para todos los métodos de prueba en la clase de prueba dada. Requisitos previos Para algunos de los procedimientos de este tema, la computadora que ejecuta las pruebas unitarias debe estar ejecutando el servicio Coordinador de transacciones distribuidas. Para obtener más información, consulte los procedimientos al final de este tema. Crear una transacción usando Transact-SQL Crear una transacción usando Transact-SQL Abra la prueba unitaria en el Diseñador de pruebas unitarias de base de datos. Especifica el tipo de script para crear la transacción. Por ejemplo, puede especificar prueba previa, prueba o prueba posterior. Ingrese el script de prueba en el editor Transact-SQL. Inserte instrucciones BEGIN TRANSACTION y ROLLBACK TRANSACTION, como se muestra en el siguiente ejemplo sencillo. Este ejemplo utiliza una tabla de base de datos denominada OrderDetails que contiene 50 filas de datos: BEGIN TRANSACTION TestTransaction UPDATE "OrderDetails" set Cantidad = Cantidad + 10 IF @@ROWCOUNT!=50 RAISERROR('El recuento de filas no es igual a 50',16,1) ROLLBACK TRANSACTION TestTransaction Tenga en cuenta que la transacción no se puede revertir después de ejecutar la instrucción COMMIT TRANSACTION. Para obtener más información sobre cómo se usa ROLLBACK TRANSACTION con desencadenadores y procedimientos almacenados, consulte ROLLBACK TRANSACTION (Transact-SQL) en el sitio web de Microsoft. Crear una transacción para un único método de prueba En este ejemplo, cuando se utiliza el tipo TransactionScope, se utiliza una transacción ambiental. De forma predeterminada, las "conexiones de ejecución" y las "conexiones privilegiadas" no utilizarán transacciones de entorno porque estas conexiones se crean antes de que se ejecute el método. SqlConnection tiene un método EnlistTransaction que asocia una conexión activa con una transacción. Una vez creada la transacción del entorno, se registra como la transacción actual, a la que puede acceder a través de la propiedad Actual. En este ejemplo, la transacción del entorno se revierte después de su liberación. Si desea confirmar algún cambio realizado mientras ejecuta pruebas unitarias, debe llamar al método Complete. Para crear una transacción para un único método de prueba En el Explorador de soluciones, haga clic con el botón derecho en el nodo Referencias en el proyecto de prueba y luego haga clic en Agregar referencia. Aparece el cuadro de diálogo Agregar referencia. Haga clic en la pestaña ".NET". En la lista de ensamblados, haga clic en System.Transactions y luego haga clic en Aceptar. Abra el archivo Visual Basic o C# de la prueba unitaria.
Ajuste las operaciones de prueba previa, de prueba y posterior, como se muestra en el siguiente ejemplo de código de Visual Basic:
Nota de eTestActions Si está utilizando Visual Basic, además de Imports Microsoft.VisualStudio.TestTools.UnitTesting, Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTesting e Imports Microsoft.VisualStudio.TeamSystem.Data.UnitTest.Conditions, también debe agregar Sistema de Importaciones. Si usa Visual C#, debe agregar el uso de System.Transactions además de las instrucciones de uso para Microsoft.VisualStudio.TestTools, Microsoft.VisualStudio.TeamSystem.Data.UnitTesting y Microsoft.VisualStudio.TeamSystem.Data.UnitTesting.Conditions. También debe agregar referencias al proyecto en estos ensamblajes. Cree una transacción para todos los métodos de prueba en una clase de prueba Cree una transacción para todos los métodos de prueba en una clase de prueba Abra el archivo Visual Basic o C# para la prueba unitaria.
Cree la transacción en TestInitialize y libérela en TestCleanup, como se muestra en el siguiente ejemplo de código de Visual C#: TransactionScope _trans; [TestInitialize()] public void Init() { _trans = new TransactionScope(); TestCleanup()] public void Cleanup() { base.CleanupTest(); _trans.Dispose(); } [TestMethod()] public void TransactedTest() { DatabaseTestActions testActions = this.DatabaseTestMethod1Data // Ejecutar el script de prueba previa / / System.Diagnostics.Trace.WriteLineIf((testActions.PretestAction != null), "Ejecutando script de prueba previa..."); ExecutionResult[] pretestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions .PretestAction ); // Ejecutar el script de prueba // System.Diagnostics.Trace.WriteLineIf((testActions.TestAction != null), "Ejecutando el script de prueba..."); ExecutionResult[] testResults = TestService.Execute(this. ExecutionContext, this.PrivilegedContext, testActions.TestAction); // Ejecutar el script posterior a la prueba // System.Diagnostics.Trace.WriteLineIf((testActions.PosttestAction != null), "Ejecutando el script posterior a la prueba..."); ] posttestResults = TestService.Execute(this.PrivilegedContext, this.PrivilegedContext, testActions.PosttestAction); }Iniciar el servicio Coordinador de transacciones distribuidas Algunos procedimientos de este tema utilizan tipos en el ensamblado System.Transactions. Antes de seguir estos procedimientos, debe asegurarse de que el servicio Coordinador de transacciones distribuidas se esté ejecutando en la computadora donde desea ejecutar las pruebas unitarias. De lo contrario, la prueba fallará con el siguiente mensaje de error: "El método de prueba nombre_proyecto.nombre_prueba.nombre_método arrojó una excepción: System.Data.SqlClient.SqlException: MSDTC no está disponible en el servidor 'nombre_computadora'". Inicie el servicio Coordinador de transacciones distribuidas y abra el Panel de control.
Abra Herramientas administrativas en el Panel de control. Abra Servicios en Herramientas administrativas. En el panel Servicios, haga clic con el botón derecho en el servicio Coordinador de transacciones distribuidas y luego haga clic en Iniciar. El estado del servicio debe actualizarse a "Iniciado". Ahora debería poder ejecutar aquellas pruebas unitarias que utilizan System.Transactions. IMPORTANTE Incluso si inicia el servicio Distributed Transaction Controller, es posible que se produzca el siguiente error: System.Transactions.TransactionManagerCommunicationException: el acceso a la red para Distributed Transaction Manager (MSDTC) se ha deshabilitado. Habilite DTC para el acceso a la red en la configuración de seguridad para MSDTC. la herramienta administrativa de servicios de componentes ---> System.Runtime.InteropServices.COMException: el administrador de transacciones ha deshabilitado su soporte para transacciones remotas/de red (Excepción de HRESULT: 0x8004D024). Si se produce este error, debe configurar el controlador de transacciones distribuidas para el acceso a la red. Para obtener más información, consulte Habilitar el acceso a DTC de red.