Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Este tutorial sigue tutorial: Creación de una aplicación de consola con .NET mediante Visual Studio Code, que le lleva más allá de la creación de una aplicación de consola sencilla para desarrollar aplicaciones avanzadas y bien organizadas. Después de mostrar cómo usar carpetas para organizar el código, el tutorial muestra cómo ampliar una aplicación de consola con el marco de pruebas xUnit .
Nota:
En este tutorial se recomienda colocar el proyecto de aplicación y probarlo en carpetas independientes. Algunos desarrolladores prefieren mantener estos proyectos en la misma carpeta. Para obtener más información, vea Problema de GitHub dotnet/docs #26395.
Uso de carpetas para organizar el código
Si desea introducir nuevos tipos en una aplicación de consola, puede hacerlo agregando archivos que contienen los tipos a la aplicación. Por ejemplo, si agrega archivos que contienen AccountInformation
y MonthlyReportRecords
tipos al proyecto, la estructura de archivos del proyecto es plana y fácil de navegar:
/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Sin embargo, esta estructura plana solo funciona bien cuando el tamaño del proyecto es relativamente pequeño. ¿Puede imaginar lo que ocurrirá si agrega 20 tipos al proyecto? Definitivamente, el proyecto no sería fácil de navegar y mantener con tantos archivos abarrotando el directorio raíz del proyecto.
Para organizar el proyecto, cree una nueva carpeta y asígne un nombre a Models para almacenar los archivos de tipo. Coloque los archivos de tipo en la carpeta Models :
/MyProject
|__/Models
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Los proyectos que agrupan lógicamente archivos en carpetas son fáciles de navegar y mantener. En la sección siguiente, creará un ejemplo más complejo con carpetas y pruebas unitarias.
Organizar y probar con el ejemplo de NewTypes Pets
Prerrequisitos
- SDK de .NET 5.0 o una versión posterior.
Creación del ejemplo
Para los pasos siguientes, puede seguir los pasos que se indican a continuación mediante el ejemplo newTypes Pets o crear sus propios archivos y carpetas. Los tipos se organizan lógicamente en una estructura de carpetas que permite la adición de más tipos más adelante, y las pruebas también se colocan lógicamente en carpetas que permiten agregar más pruebas más adelante.
El ejemplo contiene dos tipos, Dog
y Cat
, y los hace implementar una interfaz común, IPet
. Para el NewTypes
proyecto, el objetivo es organizar los tipos relacionados con mascotas en una carpeta Pets . Si se agrega otro conjunto de tipos más adelante, WildAnimals , por ejemplo, se colocan en la carpeta NewTypes junto con la carpeta Pets . La carpeta WildAnimals puede contener tipos para animales que no son mascotas, como Squirrel
y Rabbit
tipos. De este modo, a medida que se agregan tipos, el proyecto permanece bien organizado.
Cree la siguiente estructura de carpetas con el contenido del archivo indicado:
/NewTypes
|__/src
|__/NewTypes
|__/Pets
|__Dog.cs
|__Cat.cs
|__IPet.cs
|__Program.cs
|__NewTypes.csproj
IPet.cs:
using System;
namespace Pets
{
public interface IPet
{
string TalkToOwner();
}
}
Dog.cs:
using System;
namespace Pets
{
public class Dog : IPet
{
public string TalkToOwner() => "Woof!";
}
}
Cat.cs:
using System;
namespace Pets
{
public class Cat : IPet
{
public string TalkToOwner() => "Meow!";
}
}
Program.cs
using System;
using Pets;
using System.Collections.Generic;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
List<IPet> pets = new List<IPet>
{
new Dog(),
new Cat()
};
foreach (var pet in pets)
{
Console.WriteLine(pet.TalkToOwner());
}
}
}
}
NewTypes.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>
Ejecute el comando siguiente:
dotnet run
Obtenga la siguiente salida:
Woof!
Meow!
Ejercicio opcional: puede agregar un nuevo tipo de mascota, como un Bird
, ampliando este proyecto. Haga que el método TalkToOwner
de las aves proporcione Tweet!
al propietario. Vuelva a ejecutar la aplicación. La salida incluirá Tweet!
Prueba del ejemplo
El proyecto NewTypes
está en marcha y lo organizaste manteniendo los tipos relacionados con las mascotas en una carpeta. A continuación, cree el proyecto de prueba y empiece a escribir pruebas con el marco de pruebas xUnit . Las pruebas unitarias le permiten comprobar automáticamente el comportamiento de los tipos de mascotas para confirmar que funcionan correctamente.
Vuelva a la carpeta src y cree una carpeta de prueba con una carpeta NewTypesTests dentro de ella. En una línea de comandos desde la carpeta NewTypesTests, ejecute dotnet new xunit
. Este comando genera dos archivos: NewTypesTests.csproj y UnitTest1.cs.
El proyecto de prueba no puede probar actualmente los tipos en NewTypes
y requiere una referencia de proyecto al NewTypes
proyecto. Para agregar una referencia de proyecto, use el dotnet reference add
comando :
dotnet reference add ../../src/NewTypes/NewTypes.csproj
También tiene la opción de agregar manualmente la referencia del proyecto agregando un <ItemGroup>
nodo al archivo NewTypesTests.csproj :
<ItemGroup>
<ProjectReference Include="../../src/NewTypes/NewTypes.csproj" />
</ItemGroup>
NewTypesTests.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.10.0" />
<PackageReference Include="xunit" Version="2.8.1" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.8.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../../src/NewTypes/NewTypes.csproj"/>
</ItemGroup>
</Project>
El archivo NewTypesTests.csproj contiene las siguientes referencias de paquete:
-
Microsoft.NET.Test.Sdk
, la infraestructura de pruebas de .NET xunit
, el marco de pruebas de xUnit-
xunit.runner.visualstudio
, el ejecutor de pruebas NewTypes
, el código que se va a probar.
Cambie el nombre de UnitTest1.cs a PetTests.cs y reemplace el código del archivo por el código siguiente:
using System;
using Xunit;
using Pets;
public class PetTests
{
[Fact]
public void DogTalkToOwnerReturnsWoof()
{
string expected = "Woof!";
string actual = new Dog().TalkToOwner();
Assert.NotEqual(expected, actual);
}
[Fact]
public void CatTalkToOwnerReturnsMeow()
{
string expected = "Meow!";
string actual = new Cat().TalkToOwner();
Assert.NotEqual(expected, actual);
}
}
Ejercicio opcional: Si anteriormente agregó un Bird
tipo que le reporta un Tweet!
al propietario, agregue un método de prueba al archivo PetTests.csBirdTalkToOwnerReturnsTweet
para comprobar que el método TalkToOwner
funciona correctamente para el tipo Bird
.
Nota:
Aunque espere que los valores expected
y actual
sean iguales, la aserción inicial con la comprobación Assert.NotEqual
especifica que estos valores no son iguales. Siempre cree inicialmente una prueba que falle para verificar la lógica de la prueba. Después de confirmar que la prueba falla, ajusta la aserción para permitir que la prueba pase.
A continuación se muestra la estructura completa del proyecto:
/NewTypes
|__/src
|__/NewTypes
|__/Pets
|__Dog.cs
|__Cat.cs
|__IPet.cs
|__Program.cs
|__NewTypes.csproj
|__/test
|__NewTypesTests
|__PetTests.cs
|__NewTypesTests.csproj
Inicie en el directorio test/NewTypesTests . Ejecute las pruebas con el dotnet test
comando . Este comando inicia el ejecutor de pruebas especificado en el archivo del proyecto.
Como se esperaba, se produce un error en las pruebas y la consola muestra la siguiente salida:
Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation. All rights reserved.
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
[xUnit.net 00:00:00.50] PetTests.DogTalkToOwnerReturnsWoof [FAIL]
Failed PetTests.DogTalkToOwnerReturnsWoof [6 ms]
Error Message:
Assert.NotEqual() Failure
Expected: Not "Woof!"
Actual: "Woof!"
Stack Trace:
at PetTests.DogTalkToOwnerReturnsWoof() in C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\PetTests.cs:line 13
Failed! - Failed: 1, Passed: 1, Skipped: 0, Total: 2, Duration: 8 ms - NewTypesTests.dll (net5.0)
Cambie las aserciones de las pruebas de Assert.NotEqual
a Assert.Equal
:
using System;
using Xunit;
using Pets;
public class PetTests
{
[Fact]
public void DogTalkToOwnerReturnsWoof()
{
string expected = "Woof!";
string actual = new Dog().TalkToOwner();
Assert.Equal(expected, actual);
}
[Fact]
public void CatTalkToOwnerReturnsMeow()
{
string expected = "Meow!";
string actual = new Cat().TalkToOwner();
Assert.Equal(expected, actual);
}
}
Vuelva a ejecutar las pruebas con el dotnet test
comando y obtenga la siguiente salida:
Test run for C:\Source\dotnet\docs\samples\snippets\core\tutorials\testing-with-cli\csharp\test\NewTypesTests\bin\Debug\net5.0\NewTypesTests.dll (.NETCoreApp,Version=v5.0)
Microsoft (R) Test Execution Command Line Tool Version 16.8.1
Copyright (c) Microsoft Corporation. All rights reserved.
Starting test execution, please wait...
A total of 1 test files matched the specified pattern.
Passed! - Failed: 0, Passed: 2, Skipped: 0, Total: 2, Duration: 2 ms - NewTypesTests.dll (net5.0)
Pruebas superadas. Los métodos de los tipos de mascota devuelven los valores correctos al dirigirse al propietario.
Ha aprendido técnicas para organizar y probar proyectos mediante xUnit. Continúe con estas técnicas aplicándolas en sus propios proyectos. Disfrute programando.