Moq for C# (.NET): 完整指南与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

什么是 Moq 以及为什么需要它?



Moq(发音为“莫克”)是 C# (.NET) 中用于创建 mock 对象(存根)的流行库。它是单元测试生态系统的一部分,用于将被测试代码与其依赖项隔离开来。



在实际应用程序中,类通常依赖于其他类:数据库、Web 服务、文件系统、第三方服务的 API。在编写单元测试时,我们不想测试这些外部依赖项——我们只想测试我们类的逻辑。Moq 允许创建“伪造的”(mock)对象,这些对象模拟真实依赖项的行为,但完全由测试控制。



Moq 的主要使用场景:

  • 测试隔离: 在不启动数据库或外部服务的情况下测试单个类。
  • 交互验证: 确保方法被以正确的参数调用了特定次数。
  • 设置返回值: 让依赖项返回所需的数据以测试逻辑。
  • 模拟异常: 测试代码如何处理来自外部系统的错误。


Moq 适用于接口和类的虚拟方法。这是一个关键限制:您不能模拟静态方法或非虚拟方法。



安装 Moq



Moq 通过 NuGet(.NET 的包管理器)分发。可以通过以下几种方式安装:



通过 .NET CLI(推荐)

dotnet add package Moq


通过 Package Manager Console(Visual Studio)

Install-Package Moq


通过 NuGet Package Manager UI

在 Visual Studio 中:右键单击项目 → 管理 NuGet 包 → 搜索“Moq” → 安装



要求: .NET Framework 4.5+ 或 .NET Core 2.0+ / .NET 5+



快速入门:第一个使用 Moq 的测试



假设我们有一个仓库接口和一个使用它的服务:



public interface IUserRepository{    User GetUserById(int id);    void SaveUser(User user);}

public class UserService{ private readonly IUserRepository _repository;

public UserService(IUserRepository repository) { _repository = repository; }

public string GetUserName(int userId) { var user = _repository.GetUserById(userId); return user?.Name ?? "Unknown"; }}

public class User{ public int Id { get; set; } public string Name { get; set; }}


现在,我们使用 Moq 编写一个测试:



using Moq;using Xunit;

public class UserServiceTests{ [Fact] public void GetUserName_WhenUserExists_ReturnsUserName() { // Arrange var mockRepo = new Mock<IUserRepository>(); mockRepo.Setup(repo => repo.GetUserById(1)) .Returns(new User { Id = 1, Name = "Alice" });

var service = new UserService(mockRepo.Object);

// Act var result = service.GetUserName(1);

// Assert Assert.Equal("Alice", result); mockRepo.Verify(repo => repo.GetUserById(1), Times.Once); }}


示例解析:

  1. new Mock<IUserRepository>() — 为接口创建一个 mock 对象。
  2. .Setup(...) — 配置行为:当调用 GetUserById(1) 时返回用户 Alice。
  3. mockRepo.Object — 获取“伪造的”对象,并将其传递给服务。
  4. mockRepo.Verify(...) — 验证该方法是否恰好被调用了一次。


Moq 的主要方法和功能



1. Mock<T>.Setup()

功能: 配置方法的

推荐