Moq
是 .NET 平台上非常流行的一个单元测试模拟(Mock)库。它主要用于在测试中创建接口或类的模拟对象,从而隔离被测代码与外部依赖(如数据库、服务等),便于编写高质量的单元测试。
主要特点:
- 支持接口和虚方法的模拟
- 可设置方法返回值、属性值、事件等
- 可验证方法调用次数和参数
- 语法简洁,易于集成到主流测试框架(如 xUnit、NUnit、MSTest)
示例:模拟接口方法
假设有如下接口和服务类:
csharp
public interface IUserRepository
{
string GetUserName(int userId);
}
public class UserService
{
private readonly IUserRepository _repository;
public UserService(IUserRepository repository)
{
_repository = repository;
}
public string GetWelcomeMessage(int userId)
{
var name = _repository.GetUserName(userId);
return $"欢迎,{name}!";
}
}
使用 Moq
进行单元测试:
csharp
using Moq;
using Xunit;
public class UserServiceTests
{
[Fact]
public void GetWelcomeMessage_ReturnsCorrectMessage()
{
// 创建接口的模拟对象
var mockRepo = new Mock<IUserRepository>();
mockRepo.Setup(r => r.GetUserName(1)).Returns("王五");
var service = new UserService(mockRepo.Object);
var message = service.GetWelcomeMessage(1);
Assert.Equal("欢迎,王五!", message);
// 验证方法是否被调用
mockRepo.Verify(r => r.GetUserName(1), Times.Once);
}
}
说明:
- 用
Mock<IUserRepository>
创建了接口的模拟对象,并设置了返回值。 - 测试时只关注业务逻辑,不依赖真实的数据源。
- 可验证方法是否被调用,确保交互正确。
更多用法可参考官方文档:Moq 官网。