我的 C# class 中的相对路径如何与 NUnit 3.x 一起工作?

How can relative paths in my C# class work with NUnit 3.x?

我有一个包含以下代码的 C# class。

class Database
{
    private const string DatabaseFilepath = @"Settings\Database.xml";
    ...
    private void LoadDatabase()
    {
        XmlDocument databaseDocument = new XmlDocument();
        databaseDocument.Load(DatabaseFilepath);
    }
}

现在这段代码在我编译时执行得很好,它可以从 Database.xml 文件中读取。但是,当我 运行 单元测试恰好使用 NUnit 执行此代码时,我得到以下异常。

Result Message: System.IO.DirectoryNotFoundException : Could not find a part of the path 'C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\Settings\Database.xml'.

现在,当我使用 Visual Studio 测试工具时,它工作得非常好。然而,在切换到 NUnit 后,它看起来像是在不同的工作目录中搜索。我该如何更改?

注意:我发现其他问题询问如何在 test 代码中使用相对路径。在我的示例中,我的相对路径在我的 class 代码中。

作为一项政策,我们决定 NUnit 3 不应再像在 V2 中那样在 运行ning 测试时更改当前目录。使用 V2,您可以 运行 不同位置的整个程序集列表,并且 NUnit 会在 运行 之前将 cd 更改为每个程序集的位置。我们停止是因为:

  1. 更改当前目录对于 运行 其他程序所做的程序来说是一件不友好的事情。

  2. 无论如何都行不通,因为位于不同目录中的多个程序集可能会同时 运行 并行。

测试代码有一个简单的解决方案,但你说这是你的被测应用程序中的代码,所以解决方案有点不同。

在短期内,您的测试可以在 运行 需要以某种方式设置的 SUT 代码之前设置 CD。我建议在某种级别的设置中执行此操作并在相应的拆卸中恢复它。

从长远来看,修复您的 SUT,这样它就不需要以特定方式设置 CD 即可正确运行。

查理很好地解释了为什么他们决定不更改当前目录。对于我正在测试的代码,我发现使用 AppDomain.CurrentDomain.BaseDirectory 并将其与我使用 Path.Combine(...) 的相对路径结合起来可以很好地用于 NUnit 3.x.