Section 2 of 5

Mocking with Moq

🎯 What You'll Learn

  • What is mocking
  • Installing Moq
  • Creating mocks
  • Setup and Returns
  • Verify method calls

What is Mocking?

Mocking creates fake implementations of dependencies to isolate the unit being tested. This allows testing without real databases, APIs, or other external dependencies.

Installing Moq

Install Moq Bash
dotnet add package Moq

Creating Mocks

Basic Mock C#
var mockRepository = new Mock<IProductRepository>();

Setup and Returns

Setup Method Behavior C#
var mockRepository = new Mock<IProductRepository>();

// Setup method to return specific value
mockRepository
    .Setup(r => r.GetById(1))
    .Returns(new Product { Id = 1, Name = "Laptop" });

It.IsAny<T>

Match any argument of type T.

Any Argument C#
mockRepository
    .Setup(r => r.GetById(It.IsAny<int>()))
    .Returns(new Product { Name = "Test Product" });

ReturnsAsync

For async methods.

Async Setup C#
mockRepository
    .Setup(r => r.GetByIdAsync(1))
    .ReturnsAsync(new Product { Id = 1 });

Verify Method Calls

Verify C#
// Verify method was called once
mockRepository.Verify(r => r.Add(It.IsAny<Product>()), Times.Once());

// Verify method was never called
mockRepository.Verify(r => r.Delete(It.IsAny<int>()), Times.Never());

InvenTrack Example

IProductRepository.cs C#
public interface IProductRepository
{
    Task<Product> GetByIdAsync(int id);
    Task AddAsync(Product product);
    Task UpdateAsync(Product product);
}
ProductServiceTests.cs C#
public class ProductServiceTests
{
    [Fact]
    public async Task GetProduct_ExistingId_ReturnsProduct()
    {
        // Arrange
        var mockRepo = new Mock<IProductRepository>();
        mockRepo
            .Setup(r => r.GetByIdAsync(1))
            .ReturnsAsync(new Product { Id = 1, Name = "Laptop" });

        var service = new ProductService(mockRepo.Object);

        // Act
        var result = await service.GetProductAsync(1);

        // Assert
        Assert.NotNull(result);
        Assert.Equal("Laptop", result.Name);
    }

    [Fact]
    public async Task CreateProduct_ValidProduct_CallsRepository()
    {
        // Arrange
        var mockRepo = new Mock<IProductRepository>();
        var service = new ProductService(mockRepo.Object);
        var product = new Product { Name = "Mouse", Price = 25 };

        // Act
        await service.CreateProductAsync(product);

        // Assert
        mockRepo.Verify(r => r.AddAsync(product), Times.Once());
    }
}

Key Takeaways

  • Mocking: Create fake dependencies
  • Moq: Popular .NET mocking library
  • Mock<T>: Create mock of interface
  • Setup(): Define method behavior
  • Returns()/ReturnsAsync(): Specify return values
  • It.IsAny<T>(): Match any argument
  • Verify(): Ensure methods were called