此单元测试是否正确实施?

Ayd*_*may 5 c# unit-testing

我有一个单元测试,用于检查访问权限,并确保在构建类之前有足够的文件系统访问权限.但是,我认为我的单元测试违反了单元测试原则(FIRST),例如:隔离/独立和彻底,它们正在讨论构建独立单元测试并考虑故障情景的几个方面.我也相信,以实现方式进行的单元测试是单元测试.Net框架而不是我编写的代码的功能,因为底层类没有被模拟.但我也想知道你的意见,看看我是多么错误或正确.

单元测试说明:

单元测试试图确保构造函数EventFeedFile正在执行检查访问权限的方法.那种方法叫做VerifyWritable().请注意,这EventFeedFile是一个单独的类,并VerifyWritable()在另一个类中.

[Test]
public void DirectoryNotWritableTest()
{
    var tempPath = Path.Combine(Path.GetTempPath(), "EventFileDirectoryWriteDeniedTest");
    int pageSize = 10;

    try
    {
        if (Directory.Exists(tempPath))
            Directory.Delete(tempPath, true);

        var directoryInfo = Directory.CreateDirectory(tempPath);
        var securityRules = directoryInfo.GetAccessControl();
        var writeDeniedRule =
            new FileSystemAccessRule("Everyone", FileSystemRights.CreateFiles, AccessControlType.Deny);
        securityRules.AddAccessRule(writeDeniedRule);
        directoryInfo.SetAccessControl(securityRules);

        // ReSharper disable once ObjectCreationAsStatement
        Assert.Throws<UnauthorizedAccessException>(() => new EventFeedFile(new PersistenceDirectory(tempPath),
            pageSize));
    }
    finally
    {
        if (Directory.Exists(tempPath))
            Directory.Delete(tempPath, true);
    }
}

/// <param name="directory">The directory containing the persistence file.</param>
/// <param name="pageSize">The size of event feed page.</param>
public EventFeedFile(PersistenceDirectory directory, int pageSize)
{
    directory.EnsureExists();
    directory.VerifyWritable();
    mParentDirectory = directory.TargetPath;
    mFullName = Path.Combine(mParentDirectory, Constants.FILE_NAME_EVENTPERSISTENCE);
    mPageSize = pageSize;
}

public void VerifyWritable()
{
    using (File.Create(
        Path.Combine(TargetPath, Path.GetRandomFileName()),
        1024,
        FileOptions.DeleteOnClose))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

Tom*_*r W 5

如你所说,你正在测试EventFeedFile
你也说VerifyWritable是在一个不同的模块.

然后,它是很明显VerifyWritable()应该被嘲笑到返回抛出分别测试意图.
而不是做两件坏事:

  1. VerifyWritable在您不想要时测试代码.
    如果它有问题,你的测试将失败超出范围代码(或者更糟糕的是,将传递错误的代码).

  2. 你实际上是在编写文件,而且对于我认为不好的做法,访问规则会严重缩放,并且在切换FileSystems/OperatingSystems(或版本)时可能会发生变化

注意:测试实际上并不测试.NET Framework ...它只是利用Real Environment,而不是为Test使用创建Mocked(虚拟环境).