Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här självstudien följer Självstudie: Skapa ett konsolprogram med .NET med Visual Studio Code, vilket tar dig bortom skapandet av en enkel konsolapp för att utveckla avancerade och välorganiserade program. Efter att ha visat hur du använder mappar för att organisera koden, visar handledningen hur du utökar ett konsolprogram med xUnit-testramverket.
Anmärkning
I den här självstudien rekommenderar vi att du placerar programprojektet och testprojektet i separata mappar. Vissa utvecklare föredrar att behålla dessa projekt i samma mapp. För mer information, se GitHub-ärende dotnet/docs #26395.
Använda mappar för att organisera kod
Om du vill introducera nya typer i en konsolapp kan du göra det genom att lägga till filer som innehåller typerna i appen. Om du till exempel lägger till filer som innehåller AccountInformation och MonthlyReportRecords typer i projektet är projektfilstrukturen platt och enkel att navigera i:
/MyProject
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Den här platta strukturen fungerar dock bara bra när storleken på projektet är relativt liten. Kan du föreställa dig vad som händer om du lägger till 20 typer i projektet? Projektet skulle definitivt inte vara lätt att navigera och underhålla med så många filer som skräpar ner projektets rotkatalog.
Om du vill organisera projektet skapar du en ny mapp och ger den namnet Modeller för att lagra typfilerna. Placera typfilerna i mappen Modeller :
/MyProject
|__/Models
|__AccountInformation.cs
|__MonthlyReportRecords.cs
|__MyProject.csproj
|__Program.cs
Projekt som logiskt grupperar filer i mappar är enkla att navigera och underhålla. I nästa avsnitt skapar du ett mer komplext exempel med mappar och enhetstestning.
Organisera och testa med hjälp av NewTypes Pets-samlingen
Förutsättningar
- .NET 5.0 SDK eller en senare version.
Skapa exemplet
För följande steg kan du antingen följa med genom NewTypes Pets-exemplet eller skapa egna filer och mappar. Typerna är logiskt ordnade i en mappstruktur som tillåter tillägg av fler typer senare, och tester placeras också logiskt i mappar som tillåter tillägg av fler tester senare.
Exemplet innehåller två typer, Dog och Cat, och har dem implementera ett gemensamt gränssnitt, IPet.
NewTypes För projektet är målet att organisera de husdjursrelaterade typerna i mappen Husdjur. Om en annan uppsättning typer läggs till senare, till exempel WildAnimals , placeras de i mappen NewTypes tillsammans med mappen Husdjur . Mappen WildAnimals kan innehålla typer för djur som inte är husdjur, till exempel Squirrel och Rabbit typer. På så sätt som typer läggs till förblir projektet välorganiserat.
Skapa följande mappstruktur med angivet filinnehåll:
/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>
Kör följande kommando:
dotnet run
Hämta följande utdata:
Woof!
Meow!
Valfri övning: Du kan lägga till en ny husdjurstyp, till exempel en Bird, genom att utöka det här projektet. Låt fågelns TalkToOwner-metod ge en Tweet! till ägaren. Kör appen igen. Utdata kommer att innehålla Tweet!
Testa exemplet
Projektet NewTypes är på plats och du har organiserat det genom att behålla de husdjursrelaterade typerna i en mapp. Skapa sedan testprojektet och börja skriva tester med xUnit-testramverket . Med enhetstestning kan du automatiskt kontrollera beteendet för dina husdjurstyper för att bekräfta att de fungerar korrekt.
Gå tillbaka till mappen src och skapa en testmapp med mappen NewTypesTests i den. Kör i en kommandotolk från mappen dotnet new xunit . Det här kommandot genererar två filer: NewTypesTests.csproj och UnitTest1.cs.
Testprojektet kan för närvarande inte testa typerna i NewTypes och kräver en projektreferens till NewTypes projektet. Om du vill lägga till en projektreferens använder du dotnet reference add kommandot:
dotnet reference add ../../src/NewTypes/NewTypes.csproj
Du kan också lägga till projektreferensen manuellt genom att lägga till en <ItemGroup> nod i filen 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>
Filen NewTypesTests.csproj innehåller följande paketreferenser:
-
Microsoft.NET.Test.Sdk, testinfrastruktur för .NET -
xunit, xUnit-testramverket -
xunit.runner.visualstudio, testkörare -
NewTypes, koden som ska testas
Ändra namnet på UnitTest1.cs till PetTests.cs och ersätt koden i filen med följande kod:
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);
}
}
Valfri övning: Om du lade till en Bird typ tidigare som ger ägaren en Tweet! , lägger du till en testmetod i filen PetTests.cs för BirdTalkToOwnerReturnsTweetatt kontrollera att TalkToOwner metoden fungerar korrekt för Bird typen.
Anmärkning
Även om du förväntar dig att expected och actual-värdena är lika, anger en inledande kontroll med Assert.NotEqual att dessa värden inte är lika. Skapa alltid ett test som misslyckas för att kontrollera testets logik. När du har bekräftat att testet misslyckas justerar du försäkran så att testet kan godkännas.
Följande visar den fullständiga projektstrukturen:
/NewTypes
|__/src
|__/NewTypes
|__/Pets
|__Dog.cs
|__Cat.cs
|__IPet.cs
|__Program.cs
|__NewTypes.csproj
|__/test
|__NewTypesTests
|__PetTests.cs
|__NewTypesTests.csproj
Starta i katalogen test/NewTypesTests . Kör testerna med dotnet test kommandot . Det här kommandot startar testkören som anges i projektfilen.
Som förväntat misslyckas testningen och konsolen visar följande utdata:
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)
Ändra försäkran för dina tester från Assert.NotEqual till 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);
}
}
Kör testerna igen med dotnet test kommandot och hämta följande utdata:
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)
Testningen godkänns. Husdjurstypernas metoder returnerar rätt värden när de pratar med ägaren.
Du har lärt dig tekniker för att organisera och testa projekt med hjälp av xUnit. Fortsätt med dessa tekniker och tillämpa dem i dina egna projekt. Glad kodning!