1. Set up Unit Testing Project
When you create a new Web API project in .NET 8, you can add a test project separately:
dotnet new xunit -n MyApi.Tests
dotnet add MyApi.Tests reference MyApi
Here
You can use xUnit (default choice), or NUnit / MSTest, depending on preference.
xUnit is most commonly used in the .NET Core ecosystem.
2. Install Required NuGet Packages
Inside your test project:
dotnet add package xunit
dotnet add package xunit.runner.visualstudio
dotnet add package FluentAssertions
dotnet add package Moq
xUnit → testing framework
FluentAssertions → readable assertions (e.g., result.Should().Be(200))
Moq → mocking dependencies
3. Structure of the Solution
MyApi/
Controllers/
WeatherController.cs
Services/
IWeatherService.cs
WeatherService.cs
MyApi.Tests/
Controllers/
WeatherControllerTests.cs
Services/
WeatherServiceTests.cs
4. Writing Unit Tests for a Service
Suppose you have a service:
public interface IWeatherService
{
int GetTemperature(string city);
}
public class WeatherService : IWeatherService
{
public int GetTemperature(string city)
{
if (city == "Delhi") return 35;
return 25;
}
}
✅ Unit Test Example
using Xunit;
using FluentAssertions;
using MyApi.Services;
public class WeatherServiceTests
{
[Fact]
public void GetTemperature_ShouldReturn35_WhenCityIsDelhi()
{
// Arrange
var service = new WeatherService();
// Act
var result = service.GetTemperature("Delhi");
// Assert
result.Should().Be(35);
}
}
5. Writing Unit Tests for a Controller
Suppose you have a controller:
[ApiController]
[Route("api/[controller]")]
public class WeatherController : ControllerBase
{
private readonly IWeatherService _weatherService;
public WeatherController(IWeatherService weatherService)
{
_weatherService = weatherService;
}
[HttpGet("{city}")]
public IActionResult GetWeather(string city)
{
var temp = _weatherService.GetTemperature(city);
return Ok(new { City = city, Temperature = temp });
}
}
✅ Unit Test with Mocking Dependency
using Xunit;
using FluentAssertions;
using Moq;
using Microsoft.AspNetCore.Mvc;
using MyApi.Controllers;
using MyApi.Services;
public class WeatherControllerTests
{
[Fact]
public void GetWeather_ShouldReturnOkWithTemperature()
{
// Arrange
var mockService = new Mock<IWeatherService>();
mockService.Setup(s => s.GetTemperature("Delhi")).Returns(35);
var controller = new WeatherController(mockService.Object);
// Act
var result = controller.GetWeather("Delhi") as OkObjectResult;
// Assert
result.Should().NotBeNull();
result!.StatusCode.Should().Be(200);
var response = result.Value as dynamic;
((int)response.Temperature).Should().Be(35);
}
}
6. Running Tests
Run tests using:
dotnet test
7. Best Practices
Test only logic, not infrastructure (e.g., don’t test DB directly in unit tests → use integration tests for that).
Use Moq or other mocking frameworks for dependencies.
Follow the AAA Pattern: Arrange → Act → Assert.
Keep tests independent (no shared state).
For Web API end-to-end testing, consider WebApplicationFactory in integration tests.