0

0

C# Fakes框架使用方法 C#如何使用Microsoft Fakes进行隔离测试

月夜之吻

月夜之吻

发布时间:2026-02-15 10:22:03

|

115人浏览过

|

来源于php中文网

原创

fakes是仅适用于.net framework 4.0+的隔离测试框架,依赖vs ide生成fakesassemblies,不支持.net core/5+及vs 2022,现已淘汰;推荐改用moq+di等现代方案。

c# fakes框架使用方法 c#如何使用microsoft fakes进行隔离测试

什么是Fakes,它现在还能用吗 Fakes 是 Microsoft 为 .NET Framework(仅限)提供的轻量级隔离测试框架,核心是生成 FakesAssemblies,把对 Systemmscorlib 或第三方程序集的调用重定向到可自定义行为的委托。但它**仅支持 .NET Framework 4.0+,不支持 .NET Core / .NET 5+**。Visual Studio 2019 是最后一个提供完整 Fakes 设计器支持的版本;VS 2022 已完全移除 Fakes 项目模板和右键“Add Fakes Assembly”菜单。

如果你正在用 .NET 6+ 或跨平台开发,Microsoft.Fakes 不可用——不是配置问题,而是根本没实现。别浪费时间查“为什么 Fakes 不生成”或“如何在 SDK 风格项目中启用”,答案统一:不能。

在 .NET Framework 项目中启用 Fakes 的关键步骤 Fakes 不是 NuGet 包,也不靠 dotnet test 驱动,它依赖 VS IDE 的专有生成逻辑和特定项目结构:
  • 必须使用传统 .csproj(即非 SDK 风格),且目标框架为 net472 或更高(但 ≤ net48
  • 测试项目需引用待测程序集(.dll),右键该引用 → “Add Fakes Assembly” → VS 自动生成 xxx.Fakes 子文件夹和 .fakes 配置文件
  • 生成后,项目自动添加对 Microsoft.QualityTools.Testing.Fakes 的引用,并在编译时调用 fakes.exe 工具生成桩类型(如 ShimDateTimeStubIList<t></t>
  • 务必在测试方法上标注 [TestMethod] 且类标记 [TestClass];Fakes 上下文只在 MSTest v2(Microsoft.VisualStudio.TestTools.UnitTesting)中有效

常见失败现象:CS0246 未能找到类型“ShimDateTime” —— 多半是没成功生成 Fakes 程序集,或项目 SDK 风格被误改;检查 obj\Fakes 目录是否存在生成的 .dll.pdb

Shim 和 Stub 的区别与典型用法 Fakes 提供两类桩类型:Shim(针对静态/非虚成员,如 DateTime.NowFile.ReadAllText)和 Stub(针对接口或虚方法,需传入实现):
  • Shim 必须在 ShimsContext.Create() 作用域内使用,离开即失效;它修改的是 IL 调用点,线程局部生效
  • Stub 是运行时对象替换,无需上下文,但只能用于可被继承/实现的成员(如 IRepository 接口)
  • 避免在 Shim 中捕获异常后吞掉——它会干扰原始调用链;应明确 ShimXXX.BehaveAsNotImplemented() 或抛出自定义异常

示例:拦截 DateTime.Now

Lemonaid
Lemonaid

AI音乐生成工具,在音乐领域掀起人工智能革命

下载
using (ShimsContext.Create())
{
    ShimDateTime.NowGet = () => new DateTime(2020, 1, 1);
    Assert.AreEqual(new DateTime(2020, 1, 1), DateTime.Now);
}

注意:ShimDateTime 类型由 Fakes 自动生成,命名规则是 Shim + 原类型名;属性访问器需写成 NowGet(而非 get_Now)。

为什么现在更推荐 Moq + Microsoft.Extensions.DependencyInjection Fakes 的强耦合性带来几个硬伤:fakes.exe 生成慢、调试符号难追踪、无法用于 CI(因依赖 VS 安装)、不支持 async 成员桩(ShimTask 无可靠行为)。而现代替代方案更直接:
  • Moq 模拟接口(如 IMemoryCacheIHttpClientFactory),配合 ServiceCollection 替换服务,覆盖 80%+ 场景
  • DateTime 等基础类型,封装为 IDateTimeProvider 接口再注入,比 Shim 更易测、更清晰
  • FileRegistry 等系统 IO,改用内存实现(如 InMemoryDatabaseMemoryStream)或抽象为服务

Fakes 的唯一不可替代场景只剩:必须在不改源码前提下,临时劫持某个 .NET Framework 内部静态方法(如 Assembly.GetExecutingAssembly())——但这类需求本身已属反模式,长期维护成本极高。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1441

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

362

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2217

2025.12.29

java接口相关教程
java接口相关教程

本专题整合了java接口相关内容,阅读专题下面的文章了解更多详细内容。

37

2026.01.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

673

2023.08.10

vscode和visualstudio的区别
vscode和visualstudio的区别

Visual Studio是一款功能强大的集成开发环境(IDE),适用于专业开发人员进行复杂项目的构建。而VSCode则是一款轻量级的代码编辑器,更适合各种规模的项目开发。想了解更多vscode的相关内容,可以阅读本专题下面的文章。

520

2024.03.15

vscode和visualstudio对比分析
vscode和visualstudio对比分析

VSCode是一款轻量级代码编辑器,界面简洁,支持广泛的编程语言,适合个人开发者和小团队。而Visual Studio是一款全功能IDE,界面复杂但功能丰富,适合大型项目开发和团队协作,特别是面向.NET开发。想了解更多vscode的相关内容,可以阅读本专题下面的文章。

305

2024.04.01

vsd文件打开方法
vsd文件打开方法

vsd文件打开方法有使用Microsoft Visio软件、使用Microsoft Visio查看器、转换为其他格式等。想了解更多vsd文件相关内容,可以阅读本专题下面的文章。

500

2023.10.30

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.5万人学习

ASP教程
ASP教程

共36课时 | 25.9万人学习

李炎恢ASP基础视频教程
李炎恢ASP基础视频教程

共210课时 | 44.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号