NUnit的文件/注册表测试用例

时间:2009-11-04 21:41:28

标签: .net tdd nunit

我是新的(截至今天)NUnit和TDD。但是,我对这项技术非常感兴趣,而且我正在努力学习。我有一个测试用例我想从文件中读取它是否存在,否则我将从注册表中获取。我如何测试这两个条件?以下是我想为以下代码编写测试用例的代码示例:

    public static string ReferenceDirectory
    {
          get
        {
            string referenceDir = Path.Combine(_summitDataDirectory, REFERENCES_DIR); ;
            //If Windows Compliant data location does not exist, fall back on registry values
            if (!Directory.Exists(referenceDir))
                referenceDir = Path.Combine(GetRegistryValue("appPath"), @"Data\Databases\");                                    

            return referenceDir;
        }
    }

我感到困惑的是,我是否需要创建两个测试用例:一个用于创建目录,另一个用于删除目录并从注册表中读取?此外,在某些时候,注册表将被清理,并且值不再在注册表中,这将意味着此代码不再有效,除非我在注册表中创建值。

为了提供更大的上下文,此代码用于将我们的应用程序迁移到Vista / Win7,因此我需要支持注册表的旧路径,直到迁移所有用户。

注意:特定的测试代码示例会有所帮助,因为我对NUnit完全不熟悉。

编辑:基于评论的修改代码示例。

2 个答案:

答案 0 :(得分:1)

如果我正在测试此代码,那么这是我的方案列表。

  • 确实存在referenceDir时的测试代码。
  • referenceDir不存在且注册表值有效时测试代码 存在。
  • referenceDir没有时测试代码 存在,注册表值不存在 存在。

我想知道在每个场景中要执行的代码是什么。所以,为了回答你的第一部分,我会说你需要编写三个单独的单元测试。

至于可能清理注册表项的情况,我不知道该推荐什么 - 如果密钥不存在,您可以将哪些用作B计划?

编辑:我刚注意到referenceDir未设置为代码中的值,您的示例中是否缺少某些代码,因为Directory.Exist(referenceDir)将始终失败。

答案 1 :(得分:1)

您的测试应该隔离并且不测试目录或注册表的MS方法。您可以假设Microsoft已正确编码它们。大多数人解决这个问题的简单方法是将调用移动到可以被测试中的分流类重写的方法,如下所示:

protected virtual bool DirectoryExists(string path){
   return Directory.Exists(path);
}

然后在你的测试中,而不是测试你所处理的课程;测试一个扩展被测试类的分流类,然后覆盖:

protected override bool DirectoryExists(string path){
       return true; // or false or set a instance variable that you can manipulate
    }

关键是你想要的最后一件事是你的测试必须创建文件或注册表项。这会变得混乱而缓慢。

是的,这一切都意味着你的财产可能不再是静态的。

!编辑问题 如果你绝对需要保持类静态,你可以这样做:

public class Foo{
private IDirectoryAccessor dir;

public static Foo(){
   dir = new MicrosoftDirectoryAccessor();
}    

public static SetDirectoryAccessor(IDirectoryAccessor dir){
  set this.dir = dir;
}

public static string ReferenceDirectory
{
      get
    {
        string referenceDir = Path.Combine(_summitDataDirectory, REFERENCES_DIR); ;
        //If Windows Compliant data location does not exist, fall back on registry values
        if (!dir.Exists(referenceDir))
            referenceDir = Path.Combine(GetRegistryValue("appPath"), @"Data\Databases\");                                    

        return referenceDir;
    }
}

您始终可以将访问对象的setter放在已测试的子类