【问题标题】:Environment.CurrentDirectory getting set to system32; how do I determine where?Environment.CurrentDirectory 设置为 system32;我如何确定在哪里?
【发布时间】:2014-05-26 19:41:06
【问题描述】:

我的问题是,当我的测试套件正在运行时,Environment.CurrentDirectory 会在某个地方以某种方式并且只是偶尔设置为C:\Windows\System32。一些测试依赖于当前目录,结果它们失败了。

我已经在我的项目中进行了查找,并确认我的代码都没有设置该属性。不过,我使用了许多 3rd-party 库,所以我怀疑其中一个正在修改当前目录。

我专门针对当前目录更改为 system32 进行了一些搜索,但结果为空。发生这种情况是否有一些常见原因?

另一种方法,同样是空的,是:我怎样才能找到罪魁祸首?据我所知,当值发生变化时,我不能让 Visual Studio 在任何地方中断。因为它是一个环境变量并且在 .NET 库中,所以我无法在 setter 中设置断点。

我想过使用 procmon 什么的,它希望记录当前目录何时发生变化,但是当它发生时它并没有暂停执行,所以我仍然不知道它发生在哪里。

我不知道如何调试它。有任何想法吗?还是我唯一的办法是将 Environment.CurrentDirectory 保存到全局只读字段并在我的代码中专门引用它,从而允许修改当前目录而不受惩罚?

【问题讨论】:

  • 为什么你的测试需要知道当前目录是什么?确定运行程序集的路径不是更好吗?
  • @stuartd 相信我,如果我写了它们,它们就不会依赖于当前目录......这是一个很好的观点,但是这可能都没有实际意义,因为没有什么真正应该是完全使用 ebvieonment 变量。

标签: c# .net windows visual-studio


【解决方案1】:

首先,依赖外部资源进行单元测试是一种非常糟糕的方法。当其他人测试您的代码时,依赖于当前目录的单元测试可能会失败。

为什么不使用 Microsoft Fakes 为目录返回特定值?

为了创建一个假的,在单元测试的引用中,右键单击该引用并单击“添加假组件”。

例如,如果您的单元测试依赖于当前日期,则 Fake 可以使用以下代码生成另一个日期/时间:

ShimDateTime.NowGet = ()=> new DateTime(2012, 12, 21);

我推荐阅读这篇文章。价值很高:http://www.dotnetcurry.com/showarticle.aspx?ID=963

【讨论】:

  • 这会很不方便,因为他必须为每个单元测试重新创建 Shim 才能修复第三方库的奇怪行为。我宁愿去,要么 1) 使测试 not 依赖于 Environment.CurrentDirectory 路径或 2) 尝试找到导致该问题的库并修复它或 3) 使用执行程序集路径,如@stuartd 已经建议了。您还需要注意,Microsoft Fakes 仅适用于 Visual Studio Ultimate。
  • 有业务逻辑也使用当前目录,所以不严格与单元测试有关。也就是说,您可能仍然是对的,因为使用它的所有东西都可能应该使用正在执行的程序集的路径。当然,使用当前目录是有正当理由的,这意味着回答所提出的问题是有价值的,所以我希望你不介意我现在不接受这个答案。
猜你喜欢
  • 2019-03-03
  • 2011-03-09
  • 2016-08-04
  • 1970-01-01
  • 1970-01-01
  • 2017-11-25
  • 2011-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多