Swiftorial Logo
Home
Swift Lessons
Tutorials
Learn More
Career
Resources

Testing

Introduction to Unit Testing

Unit testing is a software testing technique in which individual units or components of a software are tested. The purpose is to validate that each unit of the software performs as expected. In .NET, unit tests can be written using various testing frameworks such as MSTest, NUnit, and xUnit.

Why Unit Testing?

  • Improves Code Quality: Ensures that each unit of the code works as intended.
  • Early Bug Detection: Catches bugs early in the development cycle.
  • Facilitates Refactoring: Makes it easier to refactor code with confidence.

Setting Up Unit Testing in .NET

To set up unit testing in .NET, you'll need to install a testing framework. We'll use xUnit in this tutorial.

Step 1: Create a Unit Test Project

In Visual Studio, you can create a new Unit Test project by following these steps:

  1. Right-click on the solution in Solution Explorer.
  2. Select Add > New Project.
  3. Choose xUnit Test Project and click Next.
  4. Configure the project name and location, then click Create.

Step 2: Write Your First Unit Test

Example: Writing a Unit Test


using Xunit;

public class CalculatorTests {
    [Fact]
    public void Add_ShouldReturnSum_WhenTwoNumbersAreAdded() {
        // Arrange
        var calculator = new Calculator();

        // Act
        var result = calculator.Add(2, 3);

        // Assert
        Assert.Equal(5, result);
    }
}

public class Calculator {
    public int Add(int a, int b) {
        return a + b;
    }
}
    

Step 3: Running Your Tests

To run your tests, open the Test Explorer in Visual Studio by going to Test > Test Explorer. Click the Run All button to run all tests in the solution.

Assertions in Unit Testing

Assertions are used to verify the outcome of a test. xUnit provides various assertion methods such as:

  • Assert.Equal(expected, actual): Verifies that the actual value is equal to the expected value.
  • Assert.True(condition): Verifies that the specified condition is true.
  • Assert.False(condition): Verifies that the specified condition is false.
  • Assert.Throws<TException>(action): Verifies that a specific exception is thrown.

Example: Using Assertions

Example: Using Assertions


using Xunit;

public class CalculatorTests {
    [Fact]
    public void Divide_ShouldThrowException_WhenDividingByZero() {
        // Arrange
        var calculator = new Calculator();

        // Act & Assert
        Assert.Throws<DivideByZeroException>(() => calculator.Divide(10, 0));
    }
}

public class Calculator {
    public int Divide(int a, int b) {
        if (b == 0) {
            throw new DivideByZeroException();
        }
        return a / b;
    }
}
    

Mocking Dependencies

In unit testing, mocking is used to create fake objects that simulate the behavior of real objects. This is useful for isolating the code being tested from its dependencies. Moq is a popular mocking library for .NET.

Example: Mocking Dependencies with Moq

Example: Mocking Dependencies with Moq


using Moq;
using Xunit;

public class OrderServiceTests {
    [Fact]
    public void PlaceOrder_ShouldCallSave_WhenOrderIsValid() {
        // Arrange
        var orderRepositoryMock = new Mock<IOrderRepository>();
        var orderService = new OrderService(orderRepositoryMock.Object);

        // Act
        orderService.PlaceOrder(new Order());

        // Assert
        orderRepositoryMock.Verify(r => r.Save(It.IsAny<Order>()), Times.Once);
    }
}

public interface IOrderRepository {
    void Save(Order order);
}

public class OrderService {
    private readonly IOrderRepository _orderRepository;

    public OrderService(IOrderRepository orderRepository) {
        _orderRepository = orderRepository;
    }

    public void PlaceOrder(Order order) {
        // Business logic here
        _orderRepository.Save(order);
    }
}

public class Order {
    // Order properties
}
    

Conclusion

Unit testing is an essential practice in software development that ensures individual components of an application work as expected. By using xUnit and Moq, you can write and run unit tests in .NET to improve the quality and maintainability of your code.