单元测试中无法找到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
相关产品推荐
相关产品推荐

