C# Directory.GetCurrentDirectory() 返回带 NUnit 的 system32
C# Directory.GetCurrentDirectory() returning system32 with NUnit
我正在为木偶操纵者使用第 3 方 nuget 包。我无法让涉及该库的任何代码正常工作。我查看了代码,发现了以下代码行
DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium");
问题是,当我 运行 单元测试 Directory.GetCurrentDirectory()
returns Windows/system32
并且代码失败时,因为它没有写入此目录的权限.
这似乎是有意为之的行为 https://github.com/nunit/nunit/issues/1768。这里的问题是我无法修改这个 dll 的源代码,所以我被卡住了。有什么方法可以修改 nunit,使其 returns 成为我可以为 Directory.GetCurrentDirectory()
定义的目录?
如果我没理解错的话,调用 Directory.GetCurrentDirectory
的代码在您正在测试的应用程序使用的库中。 (如果它在您自己的 NUnit 测试中,那么这个答案就必须不同。)对于库代码来说,这是一个糟糕的设计选择,因为它假定调用该库的应用程序已将当前目录设置(或保留)到适当的位置。 (IMO,应用程序可以这样做,但图书馆不行。)
我猜你 运行 正在 Visual Studio 下,因为当前目录最终是 System32。
根据设计,NUnit 本身从不更改当前目录,因此它保留为程序首次运行时的状态 运行。您可以在测试中更改它,但这样做存在风险。
这就解释了为什么您会看到这个问题。这是一个解决方法。
如果您不关心(出于测试目的)文件夹所在的位置,请在测试设置中创建一个临时文件夹并在拆卸时将其删除。您可以对每个测试(SetUp 和 TearDown)或整个夹具(OneTimeSetUp 和 OneTimeTearDown)执行此操作。
在相同的设置位置,将当前目录设置为该临时文件夹,保存原来的当前目录。用合适的拆解方法恢复。
确保使用该目录的测试不能运行并行。如果你根本不使用 ParallelizableAttribute
你应该没问题。但是,如果您在程序集或其他更高级别将其设置为某个值,请将包含这些测试的 类 标记为 [NonParallelizable]
.
最后一步非常重要。当前目录是为整个过程设置的,因此它会影响所有正在执行的测试。重要的是,当更改的目录生效时,没有其他测试 运行。
我正在为木偶操纵者使用第 3 方 nuget 包。我无法让涉及该库的任何代码正常工作。我查看了代码,发现了以下代码行
DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium");
问题是,当我 运行 单元测试 Directory.GetCurrentDirectory()
returns Windows/system32
并且代码失败时,因为它没有写入此目录的权限.
这似乎是有意为之的行为 https://github.com/nunit/nunit/issues/1768。这里的问题是我无法修改这个 dll 的源代码,所以我被卡住了。有什么方法可以修改 nunit,使其 returns 成为我可以为 Directory.GetCurrentDirectory()
定义的目录?
如果我没理解错的话,调用 Directory.GetCurrentDirectory
的代码在您正在测试的应用程序使用的库中。 (如果它在您自己的 NUnit 测试中,那么这个答案就必须不同。)对于库代码来说,这是一个糟糕的设计选择,因为它假定调用该库的应用程序已将当前目录设置(或保留)到适当的位置。 (IMO,应用程序可以这样做,但图书馆不行。)
我猜你 运行 正在 Visual Studio 下,因为当前目录最终是 System32。
根据设计,NUnit 本身从不更改当前目录,因此它保留为程序首次运行时的状态 运行。您可以在测试中更改它,但这样做存在风险。
这就解释了为什么您会看到这个问题。这是一个解决方法。
如果您不关心(出于测试目的)文件夹所在的位置,请在测试设置中创建一个临时文件夹并在拆卸时将其删除。您可以对每个测试(SetUp 和 TearDown)或整个夹具(OneTimeSetUp 和 OneTimeTearDown)执行此操作。
在相同的设置位置,将当前目录设置为该临时文件夹,保存原来的当前目录。用合适的拆解方法恢复。
确保使用该目录的测试不能运行并行。如果你根本不使用
ParallelizableAttribute
你应该没问题。但是,如果您在程序集或其他更高级别将其设置为某个值,请将包含这些测试的 类 标记为[NonParallelizable]
.
最后一步非常重要。当前目录是为整个过程设置的,因此它会影响所有正在执行的测试。重要的是,当更改的目录生效时,没有其他测试 运行。