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

单元测试中无法找到System.IO.Fakes.ShimDirectory.GetAccessControl的求助

解决ShimsContext中伪造Directory.GetAccessControl的问题

嘿,我来帮你搞定这个问题!你找不到对应的"属性"其实是个小误区——Directory.GetAccessControl不是属性,而是一组重载方法,所以在ShimDirectory里你要找的是对应的Shim方法,而不是属性成员。

下面是具体的实现步骤和示例:

1. 确认Fakes程序集引用

首先确保你的测试项目已经正确生成并引用了System.Fakes程序集(这是Microsoft Fakes为System.dll生成的Shim程序集)。如果还没生成,右键项目里的System.dll,选择"添加Fakes程序集"即可。

2. 在ShimsContext中伪造GetAccessControl方法

在ShimsContext.Create()的作用域内,你可以针对不同的GetAccessControl重载,使用对应的Shim方法来伪造行为:

示例1:伪造无参数重载(Directory.GetAccessControl(string path))

using (ShimsContext.Create())
{
    // 拦截Directory.GetAccessControl(string path)的调用,返回自定义的DirectorySecurity对象
    ShimDirectory.GetAccessControlString = (path) =>
    {
        // 这里可以构造一个模拟权限的DirectorySecurity,或者返回空实例
        var mockSecurity = new DirectorySecurity();
        // 可选:添加模拟的权限规则
        mockSecurity.AddAccessRule(
            new FileSystemAccessRule("TestUser", FileSystemRights.Read, AccessControlType.Allow)
        );
        return mockSecurity;
    };

    // 调用你的业务代码,此时它调用Directory.GetAccessControl会使用上面的伪造实现
    YourService.MethodThatChecksDirectoryPermissions(@"C:\TestPath");
}

示例2:伪造带AccessControlSections参数的重载

如果你的代码调用的是Directory.GetAccessControl(string path, AccessControlSections includeSections),可以用对应的Shim方法:

ShimDirectory.GetAccessControlStringAccessControlSections = (path, sections) =>
{
    // 根据传入的sections返回对应的模拟Security对象
    return new DirectorySecurity();
};

示例3:模拟异常场景

如果需要测试代码对异常的处理,可以在Shim方法中抛出指定异常:

ShimDirectory.GetAccessControlString = (path) =>
{
    throw new UnauthorizedAccessException("模拟无权限访问");
};

关键点提醒

  • 所有Shim的配置必须放在ShimsContext.Create()的using块内,离开作用域后Shim会自动失效。
  • Shim方法的命名规则是原方法名加上参数类型的缩写(比如GetAccessControl对应GetAccessControlString,因为第一个参数是string类型),你可以在IntelliSense里输入ShimDirectory.GetAccessControl来看到所有可用的重载Shim。

内容的提问来源于stack exchange,提问作者Isaac Dagan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:34:12