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

C#Directory.GetCurrentDirectory()返回带有NUnit的system32,c#,unit-testing,visual-studio-2017,nunit,C#,Unit Testing,Visual Studio 2017,Nunit,我正在使用第三方nuget软件包为木偶演员。我无法获得任何涉及此库的代码。我查看了代码,发现了以下代码行 DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium"); 问题是,当我运行一个单元测试目录时,GetCurrentDirectory()返回Windows/system32,代码失败,因为它没有写入此目录的权限 这似乎是有意的行为。这里的问题是我不能修改这个dll的源代码,所以我被

我正在使用第三方nuget软件包为木偶演员。我无法获得任何涉及此库的代码。我查看了代码,发现了以下代码行

DownloadsFolder = Path.Combine(Directory.GetCurrentDirectory(), ".local-chromium");
问题是,当我运行一个单元测试
目录时,GetCurrentDirectory()
返回
Windows/system32
,代码失败,因为它没有写入此目录的权限


这似乎是有意的行为。这里的问题是我不能修改这个dll的源代码,所以我被卡住了。有没有办法修改nunit,使其返回一个我可以为
目录定义的目录。GetCurrentDirectory()

如果我理解正确,调用
目录。GetCurrentDirectory
的代码位于您正在测试的应用程序使用的库中。(如果是在您自己的NUnit测试中,那么这个答案必须是不同的。)对于库代码来说,这是一个错误的设计选择,因为它假设调用库的应用程序已将当前目录设置(或保留)到适当的位置。(依我看,应用程序可以这样做,但不是库。)

我猜您是在VisualStudio下运行的,因为当前目录最终是System32

按照设计,NUnit本身从不更改当前目录,因此它与程序第一次运行时一样。您可以在测试中更改它,但这样做有风险

这就解释了为什么你会看到这个问题。这里有一个解决办法

  • 如果您不关心(出于测试目的)文件夹的位置,请在测试设置中创建一个临时文件夹,并在拆卸时将其删除。您可以对每个测试(设置和拆卸)或整个夹具(OneTimeSetUp和OneTimeEartown)执行此操作

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

  • 确保使用该目录的测试不能并行运行。如果您根本不使用
    ParallelizableAttribute
    ,您应该可以。但是,如果在程序集或其他更高级别将其设置为某个值,请将包含这些测试的类标记为
    [非并行]


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

    如果我理解正确,调用
    目录.GetCurrentDirectory
    的代码位于您正在测试的应用程序使用的库中。(如果是在您自己的NUnit测试中,那么这个答案必须是不同的。)对于库代码来说,这是一个错误的设计选择,因为它假设调用库的应用程序已将当前目录设置(或保留)到适当的位置。(依我看,应用程序可以这样做,但不是库。)

    我猜您是在VisualStudio下运行的,因为当前目录最终是System32

    按照设计,NUnit本身从不更改当前目录,因此它与程序第一次运行时一样。您可以在测试中更改它,但这样做有风险

    这就解释了为什么你会看到这个问题。这里有一个解决办法

  • 如果您不关心(出于测试目的)文件夹的位置,请在测试设置中创建一个临时文件夹,并在拆卸时将其删除。您可以对每个测试(设置和拆卸)或整个夹具(OneTimeSetUp和OneTimeEartown)执行此操作

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

  • 确保使用该目录的测试不能并行运行。如果您根本不使用
    ParallelizableAttribute
    ,您应该可以。但是,如果在程序集或其他更高级别将其设置为某个值,请将包含这些测试的类标记为
    [非并行]


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

    在调用该代码之前,您可以执行
    目录.SetCurrentDirectory
    吗?在调用该代码之前,您可以执行
    目录.SetCurrentDirectory
    吗?