Estou tendo problemas ao tentar fazer testes de unidade/integração com o .NET 8 em um projeto (pequena API que funciona). Eu queria adicionar testes a ele para aprender, já que nunca os fiz, mas estou me deparando com algo que não consigo resolver.
Estrutura raiz do meu projeto: Controladores, DTOs, Migrações, Modelos, Repositório, Serviços, mais arquivos e a pasta criada para testes (WebApi.Tests/)
Adicionei a pasta WebApi.Tests dentro do projeto principal (não sei se essa é a prática correta), mas quando executo, recebo erros como atributos duplicados e pacotes ausentes, como Xunit, FactAttribute, Fact.
Os pacotes são instalados:
/DotNetProjects/WebApi/WebApi.Tests$ dotnet list package --outdated
The following sources were used:
https://api.nuget.org/v3/index.json
Project `WebApi.Tests` has the following updates to its packages
[net8.0]:
Top-level Package Requested Resolved Latest
> coverlet.collector 6.0.0 6.0.0 6.0.4
> Microsoft.NET.Test.Sdk 17.6.0 17.6.0 17.13.0
> xunit 2.6.3 2.6.3 2.9.3
> xunit.core 2.6.3 2.6.3 2.9.3
> xunit.extensibility.core 2.6.3 2.6.3 2.9.3
> xunit.extensibility.execution 2.6.3 2.6.3 2.9.3
> xunit.runner.visualstudio 2.4.5 2.4.5 3.0.2
O mais estranho é que se eu executar meu projeto de teste sem a referência ao programa principal, consigo executar os testes sem problemas, porém quando adiciono a referência, recebo os erros: erros ao executar o teste dotnet:
DotNetProjects/WebApi/WebApi.Tests$ dotnet test
Determining projects to restore...
All projects are up-to-date for restore.
/home/gustavo.ruiz/DotNetProjects/WebApi/obj/Debug/net8.0/.NETCoreApp,Version=v8.0.AssemblyAttributes.cs(4,12): error CS0579: Duplicate 'global::System.Runtime.Versioning.TargetFrameworkAttribute' attribute [/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.csproj]
/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.Tests/GlobalUsings.cs(1,14): error CS0246: The type or namespace name 'Xunit' could not be found (are you missing a using directive or an assembly reference?) [/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.csproj]
/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.Tests/UnitTest1.cs(5,6): error CS0246: The type or namespace name 'FactAttribute' could not be found (are you missing a using directive or an assembly reference?) [/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.csproj]
/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.Tests/UnitTest1.cs(5,6): error CS0246: The type or namespace name 'Fact' could not be found (are you missing a using directive or an assembly reference?) [/home/gustavo.ruiz/DotNetProjects/WebApi/WebApi.csproj]
WebApi.csproj:
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="FluentValidation" Version="11.11.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.11" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.tools" Version="8.0.3">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
</ItemGroup>
<!-- <ItemGroup>
<Compile Include="Services.fs" />
</ItemGroup> -->
</Project>
WebApi.Testes.csproj:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0" />
<PackageReference Include="xunit" Version="2.6.3" />
<PackageReference Include="xunit.core" Version="2.6.3" />
<PackageReference Include="xunit.extensibility.core" Version="2.6.3" />
<PackageReference Include="xunit.extensibility.execution" Version="2.6.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="coverlet.collector" Version="6.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\WebApi.csproj" />
</ItemGroup>
</Project>
como comentei ao remover o ProjectReference isso executa os testes sem nenhum problema (embora ele praticamente só tenha criado o projeto de teste e tenha um código de exemplo)
UnitTest1.cs:
namespace WebApi.Tests;
public class UnitTest1
{
[Fact]
public void Test1()
{
Assert.True(true);
}
}
Coisas que tentei:
- Exclua o projeto e recrie-o (dotnet new xunit -n WebApi.Tests -o WebApi.Tests)
- Exclua os diretórios bin e obj e execute dotnet restore, dotnet clean, dotnet build
- Reinstale os pacotes de teste
Gostaria de poder executar os testes sem erros
Você não deve colocar o projeto de teste dentro do projeto principal, você deve criar uma solução e então vincular o projeto principal "webapi" e o projeto de teste.
na sua nova pasta crie o projeto de teste usando os comandos é mais estável eu diria:
# dotnet new xunit -n "Webapi.Tests"
seu projeto principal deve estar na mesma pasta
Projeto Webapi
|_ _ Webapi
|_ _ Webapi.Testes
Observe que você deve criar uma solução e adicioná-las em uma única solução. Também não se esqueça de adicionar a referência do projeto principal dentro do projeto de teste.