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