You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6中使用Microsoft Fakes Shims遇CS0234编译错误问题

.NET 6下使用Microsoft Fakes遇到CS0234错误的解决办法

核心问题:.NET 6不支持Shims功能

你参考的是.NET Framework 4.8的文档,但Microsoft Fakes在.NET 6(含所有.NET Core/.NET 5+版本)中砍掉了Shims功能——也就是原本用来伪造静态方法、密封类的那部分能力完全被移除,只剩Stubs(用于伪造接口、抽象类)可以正常使用。

编译错误的直接原因

你添加的System和System.IO的Fakes程序集,在.NET 6项目里根本不会生成System.IO.Fakes这类命名空间——因为Shims被移除后,只有Stubs会生成System.IO.Stubs这类命名空间,所以编译器找不到Fakes命名空间是必然的。

解决办法

方案1:重构代码用依赖注入(推荐)

把需要伪造的静态依赖(比如System.IO的静态方法)封装成接口,业务代码通过依赖注入获取实例,测试时用Moq这类Mock框架伪造接口实现。示例代码:

// 封装文件操作接口
public interface IFileHelper
{
    bool FileExists(string path);
}

// 调用System.IO的实际实现
public class FileHelper : IFileHelper
{
    public bool FileExists(string path) => File.Exists(path);
}

// 业务类通过构造函数注入接口
public class FileChecker
{
    private readonly IFileHelper _fileHelper;
    public FileChecker(IFileHelper fileHelper)
    {
        _fileHelper = fileHelper;
    }

    public bool IsFilePresent(string filePath) => _fileHelper.FileExists(filePath);
}

// 测试代码(用Moq)
[TestClass]
public class FileCheckerTests
{
    [TestMethod]
    public void IsFilePresent_ShouldReturnTrue_WhenMockedAsExists()
    {
        var mockHelper = new Mock<IFileHelper>();
        mockHelper.Setup(h => h.FileExists(It.IsAny<string>())).Returns(true);
        
        var checker = new FileChecker(mockHelper.Object);
        Assert.IsTrue(checker.IsFilePresent("test.txt"));
    }
}

方案2:使用第三方静态伪造库

如果无法重构代码,可以尝试专门支持.NET 6静态方法伪造的第三方库,比如Pose或StaticMock,它们能实现类似Shims的效果,拦截静态方法的调用。

若仅需使用Microsoft Fakes的Stubs功能

如果只是需要伪造接口或抽象类,正确步骤是:

  • 在MSTest项目中右键点击要伪造的程序集(如System),选择「添加Fakes程序集」
  • 代码中引用的是System.Stubs命名空间,而非System.Fakes

内容的提问来源于stack exchange,提问作者Yevgeniy P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:28:31