Testing .NET Aspire projects
In this article, you'll learn how to create a test project, write, and run tests for your .NET Aspire projects. The tests in this article are not unit tests, but rather functional or integration tests. .NET Aspire include an xUnit testing project template that you can use to test your .NET Aspire projects. The testing project template is based on the xUnit testing framework and includes a sample test that you can use as a starting point for your tests.
Create a test project
The easiest way to create a .NET Aspire test project is to use the testing project template. If you're starting a new .NET Aspire project and want to include test projects, the Visual Studio tooling supports that option. If you're adding a test project to an existing .NET Aspire project, you can use the dotnet new
command to create a test project:
dotnet new aspire-xunit
Explore the test project
The following example test project was created as part of the .NET Aspire Starter Application template. If you're unfamiliar with it, see Quickstart: Build your first .NET Aspire project. The .NET Aspire test project takes a project reference dependency on the target app host. Consider the template project:
<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="Aspire.Hosting.Testing" Version="8.0.1" />
<PackageReference Include="coverlet.collector" Version="6.0.2" />
<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="..\AspireApp1.AppHost\AspireApp1.AppHost.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="Aspire.Hosting.Testing" />
<Using Include="Xunit" />
</ItemGroup>
</Project>
The preceding project file is fairly standard. There's a PackageReference
to the Aspire.Hosting.Testing NuGet package, which includes the required types to write tests for .NET Aspire projects.
The template test project includes a WebTests
class with a single test fact. The test fact verifies the following scenario:
- The app host is successfully created and started.
- An HTTP request can be made to the
webfrontend
resource and returns a successful response.
Consider the following test class:
using System.Net;
namespace AspireApp1.Tests;
public class WebTests
{
[Fact]
public async Task GetWebResourceRootReturnsOkStatusCode()
{
// Arrange
var appHost =
await DistributedApplicationTestingBuilder.CreateAsync<Projects.AspireApp1_AppHost>();
await using var app = await appHost.BuildAsync();
await app.StartAsync();
// Act
var httpClient = app.CreateHttpClient("webfrontend");
var response = await httpClient.GetAsync("/");
// Assert
Assert.Equal(HttpStatusCode.OK, response.StatusCode);
}
}
The preceding code:
- Relies on the
DistributedApplicationTestingBuilder
to asynchronously create the app host.- The
appHost
is an instance ofIDistributedApplicationTestingBuilder
that represents the app host.
- The
- The
appHost
has itsBuildAsync
method invoked, which returns theDistributedApplication
instance as theapp
. - The
app
is started asynchronously. - An
HttpClient
is created for thewebfrontend
resource. - A simple GET request is made to the root of the
webfrontend
resource. - The test asserts that the response status code is
OK
.
Summary
By using the .NET Aspire testing project template, you can easily create test projects for your .NET Aspire projects. The template project includes a sample test that you can use as a starting point for your tests. The DistributedApplicationTestingBuilder
follows a familiar pattern to the WebApplicationFactory
in ASP.NET Core. It allows you to create a test host for your distributed application and run tests against it.
.NET Aspire
Feedback
https://aka.ms/ContentUserFeedback.
Coming soon: Throughout 2024 we will be phasing out GitHub Issues as the feedback mechanism for content and replacing it with a new feedback system. For more information see:Submit and view feedback for