如何在特殊文件夹中为用户权限编写MSpec测试?

时间:2014-06-24 10:11:22

标签: c# unit-testing user-permissions mspec

我有一个便携式应用程序更新程序。在更新应用程序之前,我们检查登录用户是否具有对工作目录的写入权限。有谁知道如何编写一个断言这些特权的测试?

这是相关的代码段:

try
{
    var security = FolderAndFiles
       .WorkingDirectory
       .GetAccessControl()
       .GetAccessRules(true, true, typeof (NTAccount));
}
catch(UnauthorizedAccessException)
{
    // throw exception
}

1 个答案:

答案 0 :(得分:0)

我处理这个问题的一种方法是创建一个包含我需要的设施的文件系统的抽象。在这个例子中,我创建了一个实用程序来从Git日志历史中提取信息。我将所有方法都设置为虚拟,以便可以对它们进行模拟,但您可以轻松定义接口。

/// <summary>
///   Class FileSystemService - an abstraction over file system services.
///   This class consists mainly of virtual methods and exists primarily to aid testability.
/// </summary>
public class FileSystemService
    {
    public virtual bool DirectoryExists(string path)
        {
        return Directory.Exists(path);
        }

    public virtual string PathCombine(string path1, string path2)
        {
        return Path.Combine(path1, path2);
        }

    public virtual string GetFullPath(string path)
        {
        return Path.GetFullPath(path);
        }

    public virtual void SaveImage(string path, Bitmap image, ImageFormat format)
        {
        image.Save(path, ImageFormat.Png);
        }
    }

创建了文件系统服务后,将其注入任何需要它的对象:

class SomeClassThatNeedsTheFileSystem
    {
    public SomeClassThatNeedsTheFileSystem(FileSystemService filesystem = null)
        {
        fileSystem = filesystem ?? new FileSystemService();
        }
    }

注意:这是一个相当小的项目,我不想参与IoC容器,所以我做了“穷人的IoC”,使FileSystemService成为一个可选参数,默认值为'null';然后我在构造函数中测试null和new up一个FileSystemService。理想情况下,对于更健壮的代码,我会强制使用参数并强制调用者传入FileSystemService。

当创建假的时候,我这样做(我正在使用MSpec和FakeItEasy):

// Some stuff elided for clarity
public class with_fake_filesystem_service
    {
    Establish context = () =>
        {
        Filesystem = A.Fake<FileSystemService>();
        };

    protected static FileSystemService Filesystem;
    }