Pruebas unitarias de JavaScript y TypeScript en Visual Studio

Puede escribir y ejecutar pruebas unitarias en Visual Studio mediante algunos de los marcos de JavaScript más populares sin necesidad de cambiar a un símbolo del sistema. Se admiten proyectos de Node.js y ASP.NET Core.

Los marcos admitidos son:

Si su marco preferido no es compatible, vea Agregar compatibilidad con un marco de pruebas unitarias para obtener información sobre cómo lograr la compatibilidad.

Escritura de pruebas unitarias para un proyecto basado en la CLI (.esproj)

Los proyectos basados en la CLI que se admiten en Visual Studio 2022 funcionan con el Explorador de pruebas. Jest es el marco de pruebas integrado para proyectos de React y Vue. Para los proyectos de Angular, se usan Karma y Jasmine. Puede ejecutar las pruebas predeterminadas que proporciona cada marco, así como otras pruebas que escriba. Simplemente, presione el botón Ejecutar en el Explorador de pruebas. Si no tiene abierto el Explorador de pruebas, seleccione Probar>Explorador de pruebas en la barra de menús.

Para ejecutar pruebas unitarias desde la línea de comandos, haga clic con el botón derecho en el proyecto en Explorador de soluciones, elija Abrir en Terminal y ejecute el comando específico del tipo de prueba.

Para obtener información sobre cómo configurar pruebas unitarias, consulte lo siguiente:

Aquí también se proporciona un ejemplo sencillo. Sin embargo, use los vínculos anteriores para obtener la información completa.

Agregue una prueba unitaria (.esproj)

El ejemplo siguiente se basa en la plantilla de proyecto TypeScript React proporcionada en Visual Studio 2022, versión 17.8 o posterior, que es la plantilla de proyecto React de TypeScript independiente. Para Vue y Angular, los pasos son similares.

  1. En el Explorador de soluciones, haga clic con el botón derecho en el proyecto react y elija Editar archivo de proyecto.

  2. Asegúrese de que las siguientes propiedades están presentes en el archivo.esproj con los valores mostrados.

    <PropertyGroup>
      <JavaScriptTestRoot>src\</JavaScriptTestRoot>
      <JavaScriptTestFramework>Jest</JavaScriptTestFramework>
    </PropertyGroup> 
    

    En este ejemplo se especifica Jest como el marco de pruebas. En su lugar, puede especificar Mocha, Tape o Jasmine.

    El elemento JavaScriptTestRoot especifica que las pruebas unitarias estarán en la carpeta src de la raíz del proyecto.

  3. En el Explorador de soluciones, haga clic con el botón derecho en el nodo npm y seleccione Instalar nuevos paquetes de npm.

    Use el cuadro de diálogo de instalación del paquete npm para instalar los siguientes paquetes de npm:

    • jest
    • jest-editor-support

    Estos paquetes se agregan al archivo package.json en dependencias.

  4. En package.json, agregue la test sección al final de la scripts sección:

    "scripts": {
       ...
       "test": "jest"
    },
    
  5. En Explorador de soluciones, haga clic con el botón derecho en la carpeta src y elija Agregar>nuevo elemento y agregue un nuevo archivo denominado App.test.tsx.

    Esto se agrega el nuevo archivo en la carpeta src.

  6. Agregue el código siguiente a App.test.tsx.

    describe('testAsuite', () => {
       it('testA1', async () => {
          expect(2).toBe(2);
       });
    });
    
  7. Al abrir el Explorador de pruebas (elija Prueba>Explorador de pruebas), Visual Studio detecta y muestra las pruebas. Si las pruebas no se muestran inicialmente, vuelva a compilar el proyecto para actualizar la lista.

    Screenshot of Test Explorer test discovery (.esproj).

    Nota:

    Para TypeScript, no use la opción outfile en tsconfig.json, ya que el Explorador de pruebas no podrá encontrar las pruebas unitarias. Puede usar la opción outdir, pero asegúrese de que los archivos de configuración, como package.json y tsconfig.json, se encuentren en la raíz del proyecto.

Ejecutar pruebas (.esproj)

Puede ejecutar las pruebas si hace clic en el vínculo Ejecutar todo del Explorador de pruebas. O bien, puede ejecutar pruebas si selecciona uno o varios grupos o pruebas, hace clic con el botón derecho y selecciona Ejecutar en el menú contextual. Las pruebas se ejecutan en segundo plano y el Explorador de pruebas actualiza y muestra los resultados automáticamente. Además, puede depurar las pruebas seleccionadas si hace clic con el botón derecho y selecciona Depurar.

En la ilustración siguiente se muestra el ejemplo con una segunda prueba unitaria agregada.

Screenshot of Test Explorer results (.esproj).

En algunos marcos de pruebas unitarias, las pruebas unitarias normalmente se ejecutan en el código JavaScript generado.

Nota:

En la mayoría de los escenarios de TypeScript, puede depurar una prueba unitaria estableciendo un punto de interrupción en el código TypeScript, haciendo clic con el botón derecho en una prueba en el Explorador de pruebas y eligiendo Depurar. En escenarios más complejos, como los que usan mapas de origen, puede que tenga dificultades para llegar a los puntos de interrupción en el código TypeScript. Como solución alternativa, pruebe a usar la palabra clave debugger.

Nota:

Actualmente no se admiten pruebas de generación de perfiles ni cobertura de código.

Escritura de pruebas unitarias para ASP.NET Core

Para agregar compatibilidad con pruebas unitarias de JavaScript y TypeScript en un proyecto de ASP.NET Core, debe agregar compatibilidad con TypeScript, Npm y pruebas unitarias al proyecto mediante la inclusión de paquetes NuGet necesarios.

Agregue una prueba unitaria (ASP.NET Core)

El ejemplo siguiente se basa en la plantilla de proyecto ASP.NET Core Model-View-Controller e incluye agregar una prueba unitaria Jest o Mocha.

  1. Cree un proyecto ASP.NET Core Model-View-Controller.

    Para obtener un proyecto de ejemplo, consulte Agregar TypeScript a una aplicación ASP.NET Core existente. Para la compatibilidad con pruebas unitarias, se recomienda empezar con una plantilla de proyecto de ASP.NET Core estándar.

  2. En el Explorador de soluciones (panel derecho), haga clic con el botón derecho en el nodo del proyecto ASP.NET Core y seleccione Administrar paquetes NuGet.

  3. En la pestaña Examinar, busque los siguientes paquetes e instale cada uno:

    Use el paquete NuGet para agregar la compatibilidad con TypeScript, en lugar del paquete de TypeScript de npm.

  4. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto y elija Editar archivo del proyecto.

    El archivo de .csprojse abre en Visual Studio.

  5. Agregue los siguientes elementos al archivo .csproj en el elemento PropertyGroup.

    En este ejemplo se especifica Jest o Mocha como marco de pruebas. En su lugar, podría especificar Tape o Jasmine.

    El elemento JavaScriptTestRoot especifica que las pruebas unitarias estarán en la carpeta tests de la raíz del proyecto.

    <PropertyGroup>
       ...
       <JavaScriptTestRoot>tests\</JavaScriptTestRoot>
       <JavaScriptTestFramework>Jest</JavaScriptTestFramework>
       <GenerateProgramFile>false</GenerateProgramFile>
    </PropertyGroup>
    
  6. En el Explorador de soluciones, haga clic con el botón derecho en el nodo del proyecto ASP.NET Core y luego, seleccione Agregar > Nuevo elemento. Elija el archivo de configuración JSON de TypeScript y, a continuación, seleccione Agregar.

    Si no ve todas las plantillas de elemento, seleccione Mostrar todas las plantillas y elija la plantilla de elemento.

    Visual Studio agrega el archivo tsconfig.json a la raíz del proyecto. Puede usar este archivo para configurar opciones para el compilador de TypeScript.

  7. Abra tsconfig.json y reemplace el código predeterminado por el siguiente código:

    {
      "compileOnSave": true,
      "compilerOptions": {
         "noImplicitAny": false,
         "noEmitOnError": true,
         "removeComments": false,
         "sourceMap": true,
         "target": "es5",
         "outDir": "wwwroot/js"
      },
      "include": [
        "scripts/**/*"
      ],
      "exclude": [
       "node_modules",
       "tests"
      ]
    }
    

    En Jest, si desea compilar pruebas de TypeScript en JavaScript, quite la carpeta de pruebas de la sección excluir.

    Los scripts de la carpeta, es donde puede colocar el código TypeScript para la aplicación. Para obtener un proyecto de ejemplo que agrega código, consulte Agregar TypeScript a una aplicación ASP.NET Core existente.

  8. Haga clic con el botón derecho en el proyecto en el Explorador de soluciones y elija Agregar>Nuevo elemento (o presione Ctrl + MAYÚS + A). Use el cuadro de búsqueda para encontrar el archivo npm, elija el archivo de configuración npm, use el nombre predeterminado y haga clic en Agregar.

    Se agrega un archivo package.json a raíz del proyecto.

  9. En el Explorador de soluciones, haga clic con el botón derecho en el nodo npm en Dependencias y seleccioneInstalar nuevos paquetes npm.

    Nota:

    En algunos escenarios, es posible que el Explorador de soluciones no muestre el nodo npm debido a un problema conocido que se describeaquí. Si necesita ver el nodo npm, descargue el proyecto y, luego, vuelva a cargarlo para que el nodo npm vuelva a aparecer. Para la descarga, haga clic con el botón derecho en el proyecto y elija Descargar el proyecto. Como alternativa, puede agregar las entradas del paquete a package.json e instalar mediante la compilación del proyecto.

    Use el cuadro de diálogo de instalación del paquete npm para instalar los siguientes paquetes de npm:

    • jest
    • jest-editor-support
    • @types/jest

    Estos paquetes se agregan al archivo package.json en devDependencies.

     "@types/jest": "^29.5.8",
     "jest": "^29.7.0",
     "jest-editor-support": "^31.1.2"
    
  10. En package.json, agregue la test sección al final de la scripts sección:

    "scripts": {
       ...
       "test": "jest"
    },
    
  11. En Explorador de soluciones, haga clic con el botón derecho en la carpeta de prueba y elija Agregar>Nuevo elemento y agregue un nuevo archivo denominadoApp.test.tsx.

    Esto se agrega el nuevo archivo en la carpeta de prueba.

  12. Agregue el código siguiente a App.test.tsx.

    describe('testAsuite', () => {
       it('testA1', async () => {
          expect(2).toBe(2);
       });
    });
    
  13. Al abrir el Explorador de pruebas (elija Prueba>Windows>Explorador de pruebas), Visual Studio detecta y muestra las pruebas. Si las pruebas no se muestran inicialmente, vuelva a compilar el proyecto para actualizar la lista. En la siguiente ilustración se muestra el ejemplo más alto, con dos archivos de prueba unitaria diferentes.

    Screenshot of Test Explorer test discovery (ASP.NET Core).

    Nota:

    Para TypeScript, no use la opción outfile en tsconfig.json, ya que el Explorador de pruebas no podrá encontrar las pruebas unitarias. Puede usar la opción outdir, pero asegúrese de que los archivos de configuración, como package.json y tsconfig.json, se encuentren en la raíz del proyecto.

Ejecución de pruebas (ASP.NET Core)

Puede ejecutar las pruebas si hace clic en el vínculo Ejecutar todo del Explorador de pruebas. O bien, puede ejecutar pruebas si selecciona uno o varios grupos o pruebas, hace clic con el botón derecho y selecciona Ejecutar en el menú contextual. Las pruebas se ejecutan en segundo plano y el Explorador de pruebas actualiza y muestra los resultados automáticamente. Además, puede depurar las pruebas seleccionadas si hace clic con el botón derecho y selecciona Depurar.

En la ilustración siguiente se muestra el ejemplo de Jest, con una segunda prueba unitaria agregada.

Screenshot of Test Explorer results (ASP.NET Core).

En algunos marcos de pruebas unitarias, las pruebas unitarias normalmente se ejecutan en el código JavaScript generado.

Nota:

En la mayoría de los escenarios de TypeScript, puede depurar una prueba unitaria estableciendo un punto de interrupción en el código TypeScript, haciendo clic con el botón derecho en una prueba en el Explorador de pruebas y eligiendo Depurar. En escenarios más complejos, como los que usan mapas de origen, puede que tenga dificultades para llegar a los puntos de interrupción en el código TypeScript. Como solución alternativa, pruebe a usar la palabra clave debugger.

Nota:

Actualmente no se admiten pruebas de generación de perfiles ni cobertura de código.

Agregar compatibilidad con un marco de pruebas unitarias

Puede agregar compatibilidad con otros marcos de pruebas si implementa la lógica de detección y ejecución mediante JavaScript.

Nota

Para ASP.NET Core, incluya el paquete NuGet Microsoft.JavaScript.UnitTest en el proyecto para agregar compatibilidad.

Para ello, agregue una carpeta con el nombre del marco de pruebas en:

<VisualStudioFolder>\Common7\IDE\Extensions\Microsoft\NodeJsTools\TestAdapter\TestFrameworks

Si no ve la carpeta NodeJsTools en un proyecto de ASP.NET Core, agregue la carga de trabajo de desarrollo de Node.js mediante el Instalador de Visual Studio. Esta carga de trabajo incluye compatibilidad con pruebas unitarias de JavaScript y TypeScript.

Esta carpeta debe contener un archivo de JavaScript con el mismo nombre que exporte las dos funciones siguientes:

  • find_tests
  • run_tests

Para obtener un buen ejemplo de las implementaciones find_tests y run_tests, vea la implementación del marco de pruebas unitarias de Mocha:

<VisualStudioFolder>\Common7\IDE\Extensions\Microsoft\NodeJsTools\TestAdapter\TestFrameworks\mocha\mocha.js

La detección de marcos de pruebas disponibles se produce al inicio de Visual Studio. Si se agrega un marco mientras se está ejecutando Visual Studio, reinicie Visual Studio para detectar el marco. Pero no es necesario reiniciar al realizar cambios en la implementación.

Pruebas unitarias en .NET Framework

No existe ninguna limitación en cuanto a la escritura de pruebas unitarias solo en proyectos de Node.js y ASP.NET Core. Al agregar las propiedades TestFramework y TestRoot a cualquier proyecto de C# o Visual Basic, esas pruebas se enumerarán y puede ejecutarlas mediante la ventana Explorador de pruebas.

Para habilitar esta opción, haga clic con el botón derecho en el nodo del proyecto en el Explorador de soluciones, elija Descargar el proyecto y después elija Editar proyecto. Después, en el archivo del proyecto, agregue los siguientes dos elementos a un grupo de propiedades.

Importante

Asegúrese de que el grupo de propiedades al que está agregando los elementos no tiene ninguna condición especificada. Esto puede causar un comportamiento inesperado.

<PropertyGroup>
    <JavaScriptTestRoot>tests\</JavaScriptTestRoot>
    <JavaScriptTestFramework>Tape</JavaScriptTestFramework>
</PropertyGroup>

Luego, agregue sus pruebas a la carpeta raíz de prueba que ha especificado y estarán disponibles para ejecutarse en la ventana Explorador de pruebas. Si no aparecen inicialmente, es posible que tenga que recompilar el proyecto.

Pruebas unitaria en .NET Core y .NET Standard

Además de las propiedades mencionadas, descritas para .NET Framework, también deberá instalar el paquete NuGet Microsoft.JavaScript.UnitTest y establecer la propiedad:

<PropertyGroup>
    <GenerateProgramFile>false</GenerateProgramFile>
</PropertyGroup>

Algunas plataformas de pruebas pueden requerir paquetes npm adicionales para la detección de pruebas. Por ejemplo, jest requiere el paquete npm jest-editor-support. Si es necesario, consulte la documentación de la plataforma específica.

Escritura de pruebas unitarias en un proyecto de Node.js (.njsproj)

Para proyectos de Node.js, antes de agregar pruebas unitarias al proyecto, asegúrese de que el marco que piensa usar está instalado localmente en el proyecto. Es sencillo con la ventana de instalación del paquete de npm.

La mejor manera de agregar pruebas unitarias al proyecto es crear una carpeta tests en él y establecerla como raíz de las pruebas en las propiedades del proyecto. También debe seleccionar el marco de pruebas que quiere usar.

Screenshot of set test root and test framework.

Puede agregar pruebas simples en blanco al proyecto mediante el cuadro de diálogo Agregar nuevo elemento. JavaScript y TypeScript se admiten en el mismo proyecto.

Screenshot of how to add new unit test.

En una prueba unitaria de Mocha, use el código siguiente:

var assert = require('assert');

describe('Test Suite 1', function() {
    it('Test 1', function() {
        assert.ok(true, "This shouldn't fail");
    })

    it('Test 2', function() {
        assert.ok(1 === 1, "This shouldn't fail");
        assert.ok(false, "This should fail");
    })
})

Si no ha establecido las opciones de la prueba unitaria en las propiedades del proyecto, debe asegurarse de que la propiedad Marco de prueba de la ventana Propiedades esté establecida en el marco de pruebas correcto para los archivos de la prueba unitaria. Esto se realiza automáticamente mediante plantillas de archivo de prueba unitaria.

Screenshot of choosing Test Framework.

Nota:

Las opciones de pruebas unitarias tienen preferencia sobre la configuración de los archivos individuales.

Después de abrir el Explorador de pruebas (elija Prueba>Windows>Explorador de pruebas), Visual Studio detecta y muestra las pruebas. Si las pruebas no se muestran inicialmente, vuelva a compilar el proyecto para actualizar la lista.

Screenshot of Test Explorer.

Nota:

Para TypeScript, no use la opción outdir ni outfile en tsconfig.json, ya que el Explorador de pruebas no encontrará las pruebas unitarias.

Ejecución de pruebas (Node.js)

Puede ejecutar pruebas en Visual Studio o desde la línea de comandos.

Ejecución de pruebas en Visual Studio

Puede ejecutar las pruebas si hace clic en el vínculo Ejecutar todo del Explorador de pruebas. O bien, puede ejecutar pruebas si selecciona uno o varios grupos o pruebas, hace clic con el botón derecho y selecciona Ejecutar en el menú contextual. Las pruebas se ejecutan en segundo plano y el Explorador de pruebas actualiza y muestra los resultados automáticamente. Además, puede depurar las pruebas seleccionadas si hace clic con el botón derecho y selecciona Depurar.

Para TypeScript, las pruebas unitarias se ejecutan en el código JavaScript generado.

Nota

En la mayoría de los escenarios de TypeScript, puede depurar una prueba unitaria estableciendo un punto de interrupción en el código TypeScript, haciendo clic con el botón derecho en una prueba en el Explorador de pruebas y eligiendo Depurar. En escenarios más complejos, como los que usan mapas de origen, puede que tenga dificultades para llegar a los puntos de interrupción en el código TypeScript. Como solución alternativa, pruebe a usar la palabra clave debugger.

Nota

Actualmente no se admiten las pruebas de generación de perfiles ni la cobertura de código.

Ejecutar pruebas desde la línea de comandos

Puede ejecutar las pruebas desde Símbolo del sistema para desarrolladores de Visual Studio mediante el siguiente comando:

vstest.console.exe <path to project file>\NodejsConsoleApp23.njsproj /TestAdapterPath:<VisualStudioFolder>\Common7\IDE\Extensions\Microsoft\NodeJsTools\TestAdapter

Este comando produce un resultado similar al siguiente:

Microsoft (R) Test Execution Command Line Tool Version 15.5.0
Copyright (c) Microsoft Corporation.  All rights reserved.

Starting test execution, please wait...
Processing: NodejsConsoleApp23\NodejsConsoleApp23\UnitTest1.js
  Creating TestCase:NodejsConsoleApp23\NodejsConsoleApp23\UnitTest1.js::Test Suite 1 Test 1::mocha
  Creating TestCase:NodejsConsoleApp23\NodejsConsoleApp23\UnitTest1.js::Test Suite 1 Test 2::mocha
Processing finished for framework of Mocha
Passed   Test Suite 1 Test 1
Standard Output Messages:
 Using default Mocha settings
 1..2
 ok 1 Test Suite 1 Test 1

Failed   Test Suite 1 Test 2
Standard Output Messages:
 not ok 1 Test Suite 1 Test 2
   AssertionError [ERR_ASSERTION]: This should fail
       at Context.<anonymous> (NodejsConsoleApp23\NodejsConsoleApp23\UnitTest1.js:10:16)

Total tests: 2. Passed: 1. Failed: 1. Skipped: 0.
Test Run Failed.
Test execution time: 1.5731 Seconds

Nota

Si aparece un error que indica que no se puede encontrar vstest.console.exe, asegúrese de que ha abierto el Símbolo del sistema para desarrolladores y no un símbolo del sistema normal.