Unit Test in ASP.NET Core Application

Introduction

Writing unit tests for an API controller in an ASP.NET Core application involves mocking the service dependencies and handling exceptions. Below is a step-by-step tutorial on how to create unit tests for an API controller with service mocking in an ASP.NET Core application, along with exception handling.

Step 1. Set up your ASP.NET Core project

Make sure you have an ASP.NET Core project with an API controller and a corresponding service. For this example, let's assume you have a UserController and a UserService.

Step 2. Install NuGet Packages

Install the necessary NuGet packages for testing.

dotnet add package Microsoft.AspNetCore.Mvc.Testing
dotnet add package Moq

Step 3. Create Unit Test Project

Create a new project for unit tests using the following command:

dotnet new xunit -n TestProject.Tests

Step 4. Mock the Service

In your unit test project, create a mock for your service using Moq. For example:

public class UserControllerTests
{
    private readonly Mock<IUserService> _userServiceMock;

    public UserControllerTests()
    {
        _userServiceMock = new Mock<IUserService>();
    }

    // Your tests go here
}

Step 5. Write Tests

Write tests for your API controller. Use the mock to set up expected behavior and assertions.

public class UserControllerTests
{
    private readonly Mock<IUserService> _userServiceMock;

    public UserControllerTests()
    {
        _userServiceMock = new Mock<IUserService>();
    }

    [Fact]
    public async Task GetUser_ReturnsUser_WhenUserExists()
    {
        // Arrange
        var userId = 1;
        var expectedUser = new User { Id = userId, Name = "John Doe" };
        _userServiceMock.Setup(x => x.GetUserAsync(userId)).ReturnsAsync(expectedUser);

        var controller = new UserController(_userServiceMock.Object);

        // Act
        var result = await controller.GetUser(userId);

        // Assert
        Assert.NotNull(result);
        Assert.Equal(expectedUser, result.Value);
    }

    // Add more tests for different scenarios
}

Step 6. Handle Exceptions

To handle exceptions, modify your controller to catch and return appropriate responses. In your tests, simulate scenarios where exceptions are thrown.

[ApiController]
[Route("api/[controller]")]
public class UserController : ControllerBase
{
    private readonly IUserService _userService;

    public UserController(IUserService userService)
    {
        _userService = userService;
    }

    [HttpGet("{userId}")]
    public async Task<ActionResult<User>> GetUser(int userId)
    {
        try
        {
            var user = await _userService.GetUserAsync(userId);
            if (user == null)
            {
                return NotFound();
            }

            return Ok(user);
        }
        catch (Exception ex)
        {
            // Log the exception if necessary
            return StatusCode(500, "Internal Server Error");
        }
    }
}

Step 7. Run Tests

Run your tests using the following command:

dotnet test

Conclusion

This article provides a basic structure for unit testing an API controller with service mocking and exception handling in an ASP.NET Core application. Adjust the code based on your specific application architecture and requirements.