C#Directory.GetCurrentDirectory()返回带有NUnit的system32

时间:2018-09-11 13:28:18

标签: c# unit-testing visual-studio-2017 nunit

我正在使用第3方nuget程序包进行伪装。我无法获得与此库有关的任何代码。我查看了代码,发现以下代码行

DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium");

问题是,当我运行单元测试时,Directory.GetCurrentDirectory()返回Windows/system32且代码失败,因为它没有写此目录的权限。

这似乎是预期的行为https://github.com/nunit/nunit/issues/1768。这里的问题是我无法修改此dll的源代码,因此被卡住了。有什么方法可以修改nunit以便它返回我可以为Directory.GetCurrentDirectory()定义的目录?

1 个答案:

答案 0 :(得分:2)

如果我理解正确,则调用Directory.GetCurrentDirectory的代码在您正在测试的应用程序所使用的库中。 (如果是在您自己的NUnit测试中,则答案必须有所不同。)对于库代码,这是一个错误的设计选择,因为它假定调用该库的应用程序已将当前目录设置(或保留)到该目录。适当的位置。 (IMO,应用程序可以执行此操作,但库不是。)

我猜您正在Visual Studio下运行,因为当前目录最终是System32。

根据设计,NUnit本身不会更改当前目录,因此它会保留与程序首次运行时相同的状态。您可以在测试中进行更改,但是这样做存在风险。

这说明了您为什么看到此问题。这是一种解决方法。

  1. 如果您不关心(出于测试目的)文件夹的位置,请在测试设置中创建一个临时文件夹,然后将其删除。您可以为每个测试(SetUp和TearDown)或整个夹具(OneTimeSetUp和OneTimeTearDown)执行此操作。

  2. 在同一安装位置中,将当前目录设置为该临时文件夹,并保存原始当前目录。使用适当的拆卸方法将其还原。

  3. 确保使用该目录的所有测试均不能并行运行。如果您根本不使用ParallelizableAttribute,则应该没问题。但是,如果您已在程序集或其他更高级别上将其设置为某个值,则将包含这些测试的类标记为[NonParallelizable]

最后一步非常重要。当前目录是为整个过程设置的,因此它将影响所有正在执行的测试。重要的是,更改后的目录生效后,请勿再运行其他测试。